34 #include "util/base/exception.h"
35 #include "util/log/logger.h"
36 #include "util/time/timemanager.h"
37 #include "audio/soundmanager.h"
38 #include "gui/console/console.h"
39 #include "gui/guimanager.h"
41 #include "vfs/vfsdirectory.h"
42 #include "vfs/directoryprovider.h"
44 #include "vfs/zip/zipprovider.h"
46 #include "eventchannel/eventmanager.h"
47 #include "video/imagepool.h"
48 #include "video/animationpool.h"
49 #include "audio/soundclippool.h"
50 #include "video/renderbackend.h"
51 #include "video/cursor.h"
52 #include "video/devicecaps.h"
54 #include "video/opengl/fife_opengl.h"
55 #include "video/opengl/renderbackendopengl.h"
56 #include "gui/base/opengl/opengl_gui_graphics.h"
58 #include "gui/base/sdl/sdl_gui_graphics.h"
59 #include "gui/base/gui_font.h"
60 #include "video/sdl/renderbackendsdl.h"
61 #include "video/fonts/abstractfont.h"
62 #include "loaders/native/video_loaders/subimage_loader.h"
63 #include "loaders/native/video_loaders/image_loader.h"
64 #include "loaders/native/audio_loaders/ogg_loader.h"
65 #include "model/model.h"
66 #include "pathfinder/routepather/routepather.h"
67 #include "model/metamodel/grids/hexgrid.h"
68 #include "model/metamodel/grids/squaregrid.h"
69 #include "view/renderers/quadtreerenderer.h"
70 #include "view/renderers/gridrenderer.h"
71 #include "view/renderers/instancerenderer.h"
72 #include "view/renderers/coordinaterenderer.h"
73 #include "view/renderers/floatingtextrenderer.h"
74 #include "view/renderers/cellselectionrenderer.h"
75 #include "view/renderers/blockinginforenderer.h"
76 #include "view/renderers/genericrenderer.h"
77 #include "view/renderers/lightrenderer.h"
78 #include "video/image.h"
79 #include "gui/console/console.h"
84 #include <objc/message.h>
87 int main(
int argc,
char **argv)
94 static Logger _log(LM_CONTROLLER);
112 m_changelisteners() {
117 cocoa_lib = dlopen(
"/System/Library/Frameworks/Cocoa.framework/Cocoa", RTLD_LAZY );
118 void (*nsappload)(void);
119 nsappload = (void(*)()) dlsym( cocoa_lib,
"NSApplicationLoad");
123 objc_object *NSAutoreleasePool = objc_getClass(
"NSAutoreleasePool");
125 objc_msgSend(NSAutoreleasePool, sel_registerName(
"new"));
139 m_cursor->invalidate();
140 m_imagepool->invalidateLoadedImages();
141 m_defaultfont->invalidate();
142 m_guimanager->invalidateFonts();
146 m_guimanager->resizeTopContainer(0,0,mode.getWidth(), mode.getHeight());
147 m_guimanager->getConsole()->reLayout();
149 std::vector<IEngineChangeListener*>::iterator i = m_changelisteners.begin();
150 while (i != m_changelisteners.end()) {
151 (*i)->onScreenModeChanged(mode);
158 void Engine::preInit() {
161 FL_LOG(_log,
"================== Engine pre-init start =================");
163 FL_LOG(_log,
"Time manager created");
165 FL_LOG(_log,
"Creating VFS");
168 FL_LOG(_log,
"Adding root directory to VFS");
172 FL_LOG(_log,
"Adding zip provider to VFS");
177 FL_LOG(_log,
"Engine pre-init done");
182 FL_LOG(_log,
"Engine initialize start");
184 FL_LOG(_log,
"Engine settings validated");
187 if (SDL_Init(SDL_INIT_NOPARACHUTE | SDL_INIT_TIMER) < 0) {
188 throw SDLException(SDL_GetError());
191 SDL_EnableUNICODE(1);
192 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
195 FL_LOG(_log,
"Creating event manager");
198 FL_LOG(_log,
"Creating pools");
206 FL_LOG(_log,
"Creating render backend");
208 if (rbackend ==
"SDL") {
210 FL_LOG(_log,
"SDL Render backend created");
214 FL_LOG(_log,
"OpenGL Render backend created");
219 FL_WARN(_log,
"Tried to select OpenGL, even though it is not compiled into the engine. Falling back to SDL Render backend");
222 FL_LOG(_log,
"Initializing render backend");
225 std::string driver = m_settings.getVideoDriver();
226 std::vector<std::string> drivers = m_devcaps.getAvailableDrivers();
229 if (std::find (drivers.begin(), drivers.end(), driver) == drivers.end()) {
230 FL_WARN(_log,
"Selected driver is not supported for your Operating System! Reverting to default driver.");
235 m_renderbackend->
init(driver);
237 FL_LOG(_log,
"Querying device capabilities");
238 m_devcaps.fillDeviceCaps();
242 m_screenMode = m_devcaps.getNearestScreenMode(
249 FL_LOG(_log,
"Creating main screen");
254 FL_LOG(_log,
"Main screen created");
257 if( rbackend !=
"SDL" ) {
266 if( rbackend ==
"SDL" ) {
269 FL_LOG(_log,
"Constructing GUI manager");
270 m_guimanager =
new GUIManager(*m_imagepool);
271 FL_LOG(_log,
"Events bind to GUI manager");
274 FL_LOG(_log,
"Creating default font");
275 m_defaultfont = m_guimanager->setDefaultFont(
279 FL_LOG(_log,
"Initializing GUI manager");
280 m_guimanager->init(m_gui_graphics, m_renderbackend->getScreenWidth(), m_renderbackend->getScreenHeight());
281 FL_LOG(_log,
"GUI manager initialized");
282 SDL_EnableUNICODE(1);
284 FL_LOG(_log,
"Creating sound manager");
285 m_soundmanager =
new SoundManager(m_soundclippool);
286 m_soundmanager->setVolume(static_cast<float>(m_settings.
getInitialVolume()) / 10);
288 FL_LOG(_log,
"Creating renderers");
289 m_renderers.push_back(
new InstanceRenderer(m_renderbackend, 10, m_imagepool, m_animpool));
290 m_renderers.push_back(
new GridRenderer(m_renderbackend, 20));
292 m_renderers.push_back(
new BlockingInfoRenderer(m_renderbackend, 40));
293 m_renderers.push_back(
new FloatingTextRenderer(m_renderbackend, 50, dynamic_cast<AbstractFont*>(m_defaultfont)));
294 m_renderers.push_back(
new QuadTreeRenderer(m_renderbackend, 60));
295 m_renderers.push_back(
new CoordinateRenderer(m_renderbackend, 70, dynamic_cast<AbstractFont*>(m_defaultfont)));
296 m_renderers.push_back(
new GenericRenderer(m_renderbackend, 80, m_imagepool, m_animpool));
297 m_renderers.push_back(
new LightRenderer(m_renderbackend, 90, m_imagepool, m_animpool));
299 FL_LOG(_log,
"Creating model");
300 m_model =
new Model(m_renderbackend, m_renderers, m_imagepool, m_animpool);
301 FL_LOG(_log,
"Adding pathers to model");
303 FL_LOG(_log,
"Adding grid prototypes to model");
307 m_cursor =
new Cursor(m_imagepool, m_animpool, m_renderbackend);
308 FL_LOG(_log,
"Engine intialized");
318 FL_LOG(_log,
"Destructing engine");
321 delete m_soundmanager;
323 delete m_gui_graphics;
330 delete m_eventmanager;
333 std::vector<RendererBase*>::iterator rendererIter = m_renderers.begin();
334 for ( ; rendererIter != m_renderers.end(); ++rendererIter)
336 delete *rendererIter;
340 m_renderbackend->
deinit();
341 delete m_renderbackend;
345 delete m_timemanager;
351 objc_msgSend(m_autoreleasePool, sel_registerName(
"release"));
354 FL_LOG(_log,
"================== Engine destructed ==================");
377 m_guimanager->turn();
392 m_changelisteners.push_back(listener);
396 std::vector<IEngineChangeListener*>::iterator i = m_changelisteners.begin();
397 while (i != m_changelisteners.end()) {
398 if ((*i) == listener) {
399 m_changelisteners.erase(i);