Mercurial > fife-parpg
diff engine/core/controller/engine.cpp @ 654:5d6b1820b953
* Added the ability to change screen modes on the fly. This works both in OpenGL and SDL modes.
* Added IEngineChangeListener so the client can update the cameras viewport if the screen mode has been changed. I chose to do it this way because the engine has no way to know which camera it should update. It will be up to the client to do it.
* The cursor surface is now correctly freed when exiting.
* Added DeviceCaps::getNearestScreenMode() for the client to request a supported screen mode.
closes[t:315]
author | prock@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Thu, 21 Oct 2010 18:50:50 +0000 |
parents | 01acc9fc35ea |
children | e3140f01749d |
line wrap: on
line diff
--- a/engine/core/controller/engine.cpp Fri Oct 15 18:54:34 2010 +0000 +++ b/engine/core/controller/engine.cpp Thu Oct 21 18:50:50 2010 +0000 @@ -74,6 +74,8 @@ #include "view/renderers/cellselectionrenderer.h" #include "view/renderers/blockinginforenderer.h" #include "view/renderers/genericrenderer.h" +#include "video/image.h" +#include "gui/console/console.h" #include "engine.h" #ifdef USE_COCOA @@ -105,7 +107,8 @@ m_logmanager(0), m_cursor(0), m_settings(), - m_devcaps(){ + m_devcaps(), + m_changelisteners() { #ifdef USE_COCOA // The next lines ensure that Cocoa is initialzed correctly. // This is needed for SDL to function properly on MAC OS X. @@ -131,6 +134,26 @@ return m_devcaps; } + Image* Engine::changeScreenMode(const ScreenMode& mode){ + m_cursor->invalidate(); + m_imagepool->invalidateLoadedImages(); + m_defaultfont->invalidate(); + m_guimanager->invalidateFonts(); + + Image* screen = m_renderbackend->setScreenMode(mode); + + m_guimanager->resizeTopContainer(0,0,mode.getWidth(), mode.getHeight()); + m_guimanager->getConsole()->reLayout(); + + std::vector<IEngineChangeListener*>::iterator i = m_changelisteners.begin(); + while (i != m_changelisteners.end()) { + (*i)->onScreenModeChanged(mode); + ++i; + } + + return screen; + } + void Engine::preInit() { m_logmanager = LogManager::instance(); @@ -248,7 +271,7 @@ m_settings.getDefaultFontSize(), m_settings.getDefaultFontGlyphs()); FL_LOG(_log, "Initializing GUI manager"); - m_guimanager->init(m_gui_graphics, m_settings.getScreenWidth(), m_settings.getScreenHeight()); + m_guimanager->init(m_gui_graphics, m_renderbackend->getScreenWidth(), m_renderbackend->getScreenHeight()); FL_LOG(_log, "GUI manager initialized"); SDL_EnableUNICODE(1); @@ -343,6 +366,21 @@ void Engine::finalizePumping() { // nothing here at the moment.. } + + void Engine::addChangeListener(IEngineChangeListener* listener) { + m_changelisteners.push_back(listener); + } + + void Engine::removeChangeListener(IEngineChangeListener* listener) { + std::vector<IEngineChangeListener*>::iterator i = m_changelisteners.begin(); + while (i != m_changelisteners.end()) { + if ((*i) == listener) { + m_changelisteners.erase(i); + return; + } + ++i; + } + } }//FIFE /* vim: set noexpandtab: set shiftwidth=2: set tabstop=2: */