Mercurial > fife-parpg
diff engine/core/controller/engine.cpp @ 0:4a0efb7baf70
* Datasets becomes the new trunk and retires after that :-)
author | mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Sun, 29 Jun 2008 18:44:17 +0000 |
parents | |
children | ae46cee19e76 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/engine/core/controller/engine.cpp Sun Jun 29 18:44:17 2008 +0000 @@ -0,0 +1,299 @@ +/*************************************************************************** + * Copyright (C) 2005-2008 by the FIFE team * + * http://www.fifengine.de * + * This file is part of FIFE. * + * * + * FIFE is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +// Standard C++ library includes +#include <iostream> + +// 3rd party library includes +#include <SDL.h> +#include <SDL_ttf.h> + +// FIFE includes +// These includes are split up in two parts, separated by one empty line +// First block: files included from the FIFE root src directory +// Second block: files included from the same folder +#include "util/base/exception.h" +#include "util/log/logger.h" +#include "util/time/timemanager.h" +#include "audio/soundmanager.h" +#include "gui/console/console.h" +#include "gui/guimanager.h" +#include "vfs/vfs.h" +#include "vfs/vfsdirectory.h" +#include "vfs/directoryprovider.h" +#ifdef HAVE_ZIP +#include "vfs/zip/zipprovider.h" +#endif +#include "eventchannel/eventmanager.h" +#include "video/imagepool.h" +#include "video/animationpool.h" +#include "audio/soundclippool.h" +#include "video/renderbackend.h" +#include "video/cursor.h" +#ifdef HAVE_OPENGL +#include "video/opengl/renderbackendopengl.h" +#include "gui/base/opengl/opengl_gui_graphics.h" +#endif +#include "gui/base/sdl/sdl_gui_graphics.h" +#include "gui/base/gui_font.h" +#include "video/sdl/renderbackendsdl.h" +#include "video/fonts/abstractfont.h" +#include "loaders/native/video_loaders/subimage_loader.h" +#include "loaders/native/video_loaders/image_loader.h" +#include "loaders/native/audio_loaders/ogg_loader.h" +//#include "loaders/fallout/model_loaders/dat1.h" +//#include "loaders/fallout/model_loaders/dat2.h" +#include "model/model.h" +#include "pathfinder/linearpather/linearpather.h" +#include "pathfinder/routepather/routepather.h" + +#include "view/view.h" +#include "view/renderers/camerazonerenderer.h" +#include "view/renderers/quadtreerenderer.h" +#include "view/renderers/gridrenderer.h" +#include "view/renderers/instancerenderer.h" +#include "view/renderers/coordinaterenderer.h" +#include "view/renderers/floatingtextrenderer.h" +#include "view/renderers/cellselectionrenderer.h" +#include "view/renderers/blockinginforenderer.h" +#include "engine.h" + +#ifdef USE_COCOA +#include <dlfcn.h> + +int main(int argc, char **argv) +{ + return 0; +} +#endif + +namespace FIFE { + static Logger _log(LM_CONTROLLER); + + Engine::Engine(): + m_renderbackend(0), + m_guimanager(0), + m_eventmanager(0), + m_soundmanager(0), + m_timemanager(0), + m_imagepool(0), + m_animpool(0), + m_soundclippool(0), + m_vfs(0), + m_model(0), + m_gui_graphics(0), + m_view(0), + m_logmanager(0), + m_cursor(0), + m_settings() { +#ifdef USE_COCOA + // The next lines ensure that Cocoa is initialzed correctly. + // This is needed for SDL to function properly on MAC OS X. + void* cocoa_lib; + cocoa_lib = dlopen( "/System/Library/Frameworks/Cocoa.framework/Cocoa", RTLD_LAZY ); + void (*nsappload)(void); + nsappload = (void(*)()) dlsym( cocoa_lib, "NSApplicationLoad"); + nsappload(); +#endif + preInit(); + } + + EngineSettings& Engine::getSettings() { + return m_settings; + } + + void Engine::preInit() { + m_logmanager = LogManager::instance(); + + FL_LOG(_log, "================== Engine pre-init start ================="); + m_timemanager = new TimeManager(); + FL_LOG(_log, "Time manager created"); + + FL_LOG(_log, "Creating VFS"); + m_vfs = new VFS(); + + FL_LOG(_log, "Adding root directory to VFS"); + m_vfs->addSource( new VFSDirectory(m_vfs) ); + m_vfs->addProvider( new DirectoryProvider() ); +#ifdef HAVE_ZIP + FL_LOG(_log, "Adding zip provider to VFS"); + m_vfs->addProvider( new ZipProvider() ); +#endif + //m_vfs->addProvider(ProviderDAT2()); + //m_vfs->addProvider(ProviderDAT1()); + FL_LOG(_log, "Engine pre-init done"); + } + + void Engine::init() { + FL_LOG(_log, "Engine initialize start"); + m_settings.validate(); + FL_LOG(_log, "Engine settings validated"); + + // If failed to init SDL throw exception. + if (SDL_Init(SDL_INIT_NOPARACHUTE | SDL_INIT_TIMER) < 0) { + throw SDLException(SDL_GetError()); + } + + SDL_EnableUNICODE(1); + SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + TTF_Init(); + + FL_LOG(_log, "Creating event manager"); + m_eventmanager = new EventManager(); + + FL_LOG(_log, "Creating pools"); + m_imagepool = new ImagePool(); + m_animpool = new AnimationPool(); + m_soundclippool = new SoundClipPool(); + m_imagepool->addResourceLoader(new SubImageLoader()); + m_imagepool->addResourceLoader(new ImageLoader(m_vfs)); + m_soundclippool->addResourceLoader(new OggLoader(m_vfs)); + + FL_LOG(_log, "Creating render backend"); + std::string rbackend(m_settings.getRenderBackend()); + if (rbackend == "SDL") { + m_renderbackend = new RenderBackendSDL(); + FL_LOG(_log, "SDL Render backend created"); + } else { +#ifdef HAVE_OPENGL + m_renderbackend = new RenderBackendOpenGL(); + FL_LOG(_log, "OpenGL Render backend created"); +#else + m_renderbackend = new RenderBackendSDL(); + // Remember the choice so we pick the right graphics class. + rbackend = "SDL"; + FL_WARN(_log, "Tried to select OpenGL, even though it is not compiled into the engine. Falling back to SDL Render backend"); +#endif + } + FL_LOG(_log, "Initializing render backend"); + m_renderbackend->setChunkingSize(m_settings.getImageChunkingSize()); + m_renderbackend->init(); + + FL_LOG(_log, "Creating main screen"); + m_renderbackend->createMainScreen( + m_settings.getScreenWidth(), + m_settings.getScreenHeight(), + static_cast<unsigned char>(m_settings.getBitsPerPixel()), + m_settings.isFullScreen()); + FL_LOG(_log, "Main screen created"); + +#ifdef HAVE_OPENGL + if( rbackend != "SDL" ) { + m_gui_graphics = new OpenGLGuiGraphics(*m_imagepool); + } +#endif + if( rbackend == "SDL" ) { + m_gui_graphics = new SdlGuiGraphics(*m_imagepool); + } + FL_LOG(_log, "Constructing GUI manager"); + m_guimanager = new GUIManager(m_eventmanager, *m_imagepool); + m_eventmanager->addSdlEventListener(m_guimanager); + // keep guimanager as the first key listener so that it can evaluate guichan hits + m_eventmanager->addKeyListener(m_guimanager); + // keep guimanager as the first mouse listener so that it can evaluate guichan hits + m_eventmanager->addMouseListener(m_guimanager); + FL_LOG(_log, "Events bind to GUI manager"); + + FL_LOG(_log, "Creating default font"); + m_defaultfont = m_guimanager->setDefaultFont( + m_settings.getDefaultFontPath(), + m_settings.getDefaultFontSize(), + m_settings.getDefaultFontGlyphs()); + FL_LOG(_log, "Initializing GUI manager"); + m_guimanager->init(m_gui_graphics, m_settings.getScreenWidth(), m_settings.getScreenHeight()); + FL_LOG(_log, "GUI manager initialized"); + SDL_EnableUNICODE(1); + + FL_LOG(_log, "Creating sound manager"); + m_soundmanager = new SoundManager(m_soundclippool); + m_soundmanager->setVolume(static_cast<float>(m_settings.getInitialVolume()) / 10); + + FL_LOG(_log, "Creating model"); + m_model = new Model(); + FL_LOG(_log, "Adding pathers to model"); + m_model->adoptPather(new LinearPather()); + m_model->adoptPather(new RoutePather()); + + FL_LOG(_log, "Creating view"); + m_view = new View(m_renderbackend, m_imagepool, m_animpool); + FL_LOG(_log, "Creating renderers to view"); + m_view->addRenderer(new CameraZoneRenderer(m_renderbackend, 0, m_imagepool)); + m_view->addRenderer(new InstanceRenderer(m_renderbackend, 10, m_imagepool, m_animpool)); + m_view->addRenderer(new GridRenderer(m_renderbackend, 20)); + m_view->addRenderer(new CellSelectionRenderer(m_renderbackend, 30)); + m_view->addRenderer(new BlockingInfoRenderer(m_renderbackend, 40)); + m_view->addRenderer(new FloatingTextRenderer(m_renderbackend, 50, dynamic_cast<AbstractFont*>(m_defaultfont))); + m_view->addRenderer(new QuadTreeRenderer(m_renderbackend, 60)); + m_view->addRenderer(new CoordinateRenderer(m_renderbackend, 70, dynamic_cast<AbstractFont*>(m_defaultfont))); + m_cursor = new Cursor(m_imagepool, m_animpool, m_renderbackend); + FL_LOG(_log, "Engine intialized"); + } + + Engine::~Engine() { + FL_LOG(_log, "Destructing engine"); + delete m_cursor; + delete m_view; + delete m_model; + delete m_soundmanager; + delete m_guimanager; + delete m_gui_graphics; + + m_renderbackend->deinit(); + delete m_renderbackend; + + // Note the dependancy between image and animation pools + // as animations reference images they have to be deleted + // before clearing the image pool. + delete m_animpool; + delete m_imagepool; + delete m_eventmanager; + + delete m_vfs; + + delete m_timemanager; + + TTF_Quit(); + SDL_Quit(); + FL_LOG(_log, "================== Engine destructed =================="); + //delete m_logmanager; + } + void Engine::initializePumping() { + m_eventmanager->processEvents(); + } + + void Engine::pump() { + m_renderbackend->startFrame(); + m_timemanager->update(); + m_model->update(); + m_view->update(); + m_guimanager->turn(); + m_cursor->draw(); + m_renderbackend->endFrame(); + SDL_Delay(1); + m_eventmanager->processEvents(); + } + + void Engine::finalizePumping() { + // nothing here at the moment.. + } +}//FIFE + +/* vim: set noexpandtab: set shiftwidth=2: set tabstop=2: */