/** * Initializes OpenGL */ void SpringApp::InitOpenGL() { SetupViewportGeometry(); glViewport(globalRendering->viewPosX, globalRendering->viewPosY, globalRendering->viewSizeX, globalRendering->viewSizeY); gluPerspective(45.0f, globalRendering->aspectRatio, 2.8f, CGlobalRendering::MAX_VIEW_RANGE); // Initialize some GL states glShadeModel(GL_SMOOTH); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); }
/** * Initializes OpenGL */ void SpringApp::InitOpenGL () { SetupViewportGeometry(); glViewport(gu->viewPosX, gu->viewPosY, gu->viewSizeX, gu->viewSizeY); gluPerspective(45.0f, (GLfloat)gu->viewSizeX / (GLfloat)gu->viewSizeY, 2.8f, MAX_VIEW_RANGE); // Initialize some GL states glShadeModel(GL_SMOOTH); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); }
/** * @param argc argument count * @param argv array of argument strings * * Executes the application * (contains main game loop) */ int SpringApp::Run (int argc, char *argv[]) { INIT_SYNCIFY; CheckCmdLineFile (argc, argv); cmdline = BaseCmd::initialize(argc,argv); if (!Initialize ()) return -1; #ifdef WIN32 SDL_EventState (SDL_SYSWMEVENT, SDL_ENABLE); #endif SDL_Event event; bool done = false; while (!done) { ENTER_UNSYNCED; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_VIDEORESIZE: { screenWidth = event.resize.w; screenHeight = event.resize.h; #ifndef WIN32 // HACK We don't want to break resizing on windows (again?), // so someone should test this very well before enabling it. SetSDLVideoMode(); #endif InitOpenGL(); activeController->ResizeEvent(); break; } case SDL_VIDEOEXPOSE: { // re-initialize the stencil glClearStencil(0); glClear(GL_STENCIL_BUFFER_BIT); SDL_GL_SwapBuffers(); glClear(GL_STENCIL_BUFFER_BIT); SDL_GL_SwapBuffers(); SetupViewportGeometry(); break; } case SDL_QUIT: { done = true; break; } case SDL_ACTIVEEVENT: { if (event.active.state & SDL_APPACTIVE) { gu->active = !!event.active.gain; } break; } case SDL_MOUSEMOTION: case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: case SDL_SYSWMEVENT: { mouseInput->HandleSDLMouseEvent (event); break; } case SDL_KEYDOWN: { int i = event.key.keysym.sym; const bool isRepeat = !!keys[i]; UpdateSDLKeys (); if (activeController) { if (i <= SDLK_DELETE) { i = tolower(i); } else if (i == SDLK_RSHIFT) { i = SDLK_LSHIFT; } else if (i == SDLK_RCTRL) { i = SDLK_LCTRL; } else if (i == SDLK_RMETA) { i = SDLK_LMETA; } else if (i == SDLK_RALT) { i = SDLK_LALT; } if (keyBindings) { const int fakeMetaKey = keyBindings->GetFakeMetaKey(); if (fakeMetaKey >= 0) { keys[SDLK_LMETA] |= keys[fakeMetaKey]; } } activeController->KeyPressed(i,isRepeat); #ifndef NEW_GUI if (activeController->userWriting){ // use unicode for printed characters i = event.key.keysym.unicode; if ((i >= SDLK_SPACE) && (i <= SDLK_DELETE)) if (activeController->ignoreNextChar || activeController->ignoreChar == char(i)) { activeController->ignoreNextChar = false; } else { activeController->userInput += char(i); } } #endif } break; } case SDL_KEYUP: { int i = event.key.keysym.sym; UpdateSDLKeys(); if (activeController) { if (i <= SDLK_DELETE) { i = tolower(i); } else if (i == SDLK_RSHIFT) { i = SDLK_LSHIFT; } else if (i == SDLK_RCTRL) { i = SDLK_LCTRL; } else if (i == SDLK_RMETA) { i = SDLK_LMETA; } else if (i == SDLK_RALT) { i = SDLK_LALT; } if (keyBindings) { const int fakeMetaKey = keyBindings->GetFakeMetaKey(); if (fakeMetaKey >= 0) { keys[SDLK_LMETA] |= keys[fakeMetaKey]; } } activeController->KeyReleased(i); } break; } } } if (globalQuit) break; if (!Update()) break; } ENTER_MIXED; // Shutdown Shutdown(); return 0; }
/** * Initializes OpenGL */ void SpringApp::InitOpenGL() { // reinit vsync VSync.Init(); // check if FSAA init worked fine if (globalRendering->FSAA && !MultisampleVerify()) globalRendering->FSAA = 0; // setup GL smoothing const int lineSmoothing = configHandler->GetInt("SmoothLines"); if (lineSmoothing > 0) { GLenum hint = GL_FASTEST; if (lineSmoothing >= 3) { hint = GL_NICEST; } else if (lineSmoothing >= 2) { hint = GL_DONT_CARE; } glEnable(GL_LINE_SMOOTH); glHint(GL_LINE_SMOOTH_HINT, hint); } const int pointSmoothing = configHandler->GetInt("SmoothPoints"); if (pointSmoothing > 0) { GLenum hint = GL_FASTEST; if (pointSmoothing >= 3) { hint = GL_NICEST; } else if (pointSmoothing >= 2) { hint = GL_DONT_CARE; } glEnable(GL_POINT_SMOOTH); glHint(GL_POINT_SMOOTH_HINT, hint); } // setup LOD bias factor const float lodBias = configHandler->GetFloat("TextureLODBias"); if (math::fabs(lodBias) > 0.01f) { glTexEnvf(GL_TEXTURE_FILTER_CONTROL, GL_TEXTURE_LOD_BIAS, lodBias ); } //FIXME not needed anymore with SDL2? if (configHandler->GetBool("FixAltTab")) { // free GL resources GLContext::Free(); // initialize any GL resources that were lost GLContext::Init(); } // setup viewport SetupViewportGeometry(); glViewport(globalRendering->viewPosX, globalRendering->viewPosY, globalRendering->viewSizeX, globalRendering->viewSizeY); gluPerspective(45.0f, globalRendering->aspectRatio, 2.8f, CGlobalRendering::MAX_VIEW_RANGE); // Initialize some GL states glShadeModel(GL_SMOOTH); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); // Clear Window glClearColor(0.0f,0.0f,0.0f,0.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); SDL_GL_SwapWindow(window); // Print Final Mode (call after SetupViewportGeometry, which updates viewSizeX/Y) SDL_DisplayMode dmode; SDL_GetWindowDisplayMode(window, &dmode); bool isBorderless = (SDL_GetWindowFlags(window) & SDL_WINDOW_BORDERLESS) != 0; LOG("[%s] video mode set to %ix%i:%ibit @%iHz %s", __FUNCTION__, globalRendering->viewSizeX, globalRendering->viewSizeY, SDL_BITSPERPIXEL(dmode.format), dmode.refresh_rate, globalRendering->fullScreen ? (isBorderless ? "(borderless)" : "") : "(windowed)"); }
bool SpringApp::MainEventHandler(const SDL_Event& event) { switch (event.type) { case SDL_VIDEORESIZE: { GML_MSTMUTEX_LOCK(sim); // MainEventHandler Watchdog::ClearTimer(WDT_MAIN, true); globalRendering->viewSizeX = event.resize.w; globalRendering->viewSizeY = event.resize.h; #ifndef WIN32 // HACK We don't want to break resizing on windows (again?), // so someone should test this very well before enabling it. SetSDLVideoMode(); #endif InitOpenGL(); activeController->ResizeEvent(); break; } case SDL_VIDEOEXPOSE: { GML_MSTMUTEX_LOCK(sim); // MainEventHandler Watchdog::ClearTimer(WDT_MAIN, true); // re-initialize the stencil glClearStencil(0); glClear(GL_STENCIL_BUFFER_BIT); SDL_GL_SwapBuffers(); glClear(GL_STENCIL_BUFFER_BIT); SDL_GL_SwapBuffers(); SetupViewportGeometry(); break; } case SDL_QUIT: { gu->globalQuit = true; break; } case SDL_ACTIVEEVENT: { Watchdog::ClearTimer(WDT_MAIN, true); //! deactivate sounds and other if (event.active.state & (SDL_APPACTIVE | (globalRendering->fullScreen ? SDL_APPINPUTFOCUS : 0))) { globalRendering->active = !!event.active.gain; if (ISound::IsInitialized()) { sound->Iconified(!event.active.gain); } } //! update keydown table if (event.active.gain) { keyInput->Update(event.key.keysym.unicode, ((keyBindings != NULL)? keyBindings->GetFakeMetaKey(): -1)); } //! unlock mouse if (mouse && mouse->locked) { mouse->ToggleMiddleClickScroll(); } //! release all keyboard keys if ((event.active.state & (SDL_APPACTIVE | SDL_APPINPUTFOCUS)) && !event.active.gain) { for (boost::uint16_t i = 1; i < SDLK_LAST; ++i) { if (keyInput->IsKeyPressed(i)) { SDL_Event event; event.type = event.key.type = SDL_KEYUP; event.key.state = SDL_RELEASED; event.key.keysym.sym = (SDLKey)i; event.key.keysym.unicode = i; //event.keysym.mod =; //event.keysym.scancode =; SDL_PushEvent(&event); } } } //! simulate mouse release to prevent hung buttons if ((event.active.state & (SDL_APPACTIVE | SDL_APPMOUSEFOCUS)) && !event.active.gain) { for (int i = 1; i <= NUM_BUTTONS; ++i) { if (mouse && mouse->buttons[i].pressed) { SDL_Event event; event.type = event.button.type = SDL_MOUSEBUTTONUP; event.button.state = SDL_RELEASED; event.button.which = 0; event.button.button = i; event.button.x = -1; event.button.y = -1; SDL_PushEvent(&event); } } //! and make sure to un-capture mouse if(SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_ON) SDL_WM_GrabInput(SDL_GRAB_OFF); } break; } case SDL_KEYDOWN: { const boost::uint16_t sym = keyInput->GetNormalizedKeySymbol(event.key.keysym.sym); const bool isRepeat = !!keyInput->GetKeyState(sym); keyInput->Update(event.key.keysym.unicode, ((keyBindings != NULL)? keyBindings->GetFakeMetaKey(): -1)); if (activeController) { activeController->KeyPressed(sym, isRepeat); if (activeController->userWriting){ // use unicode for printed characters const boost::uint16_t usym = keyInput->GetCurrentKeyUnicodeChar(); if ((usym >= SDLK_SPACE) && (usym <= 255)) { CGameController* ac = activeController; if (ac->ignoreNextChar || (ac->ignoreChar == (char)usym)) { ac->ignoreNextChar = false; } else { if (usym < 255 && (!isRepeat || ac->userInput.length() > 0)) { const int len = (int)ac->userInput.length(); const char str[2] = { (char)usym, 0 }; ac->writingPos = std::max(0, std::min(len, ac->writingPos)); ac->userInput.insert(ac->writingPos, str); ac->writingPos++; } } } } activeController->ignoreNextChar = false; } break; } case SDL_KEYUP: { keyInput->Update(event.key.keysym.unicode, ((keyBindings != NULL)? keyBindings->GetFakeMetaKey(): -1)); if (activeController) { activeController->KeyReleased(keyInput->GetNormalizedKeySymbol(event.key.keysym.sym)); } break; } default: break; } return false; }