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/guimanager.h"
40 #include "vfs/vfsdirectory.h"
41 #include "vfs/directoryprovider.h"
43 #include "vfs/zip/zipprovider.h"
45 #include "eventchannel/eventmanager.h"
46 #include "video/imagemanager.h"
47 #include "audio/soundclipmanager.h"
48 #include "video/renderbackend.h"
49 #include "video/cursor.h"
50 #include "video/devicecaps.h"
52 #include "video/opengl/fife_opengl.h"
53 #include "video/opengl/renderbackendopengl.h"
54 #include "video/opengle/renderbackendopengle.h"
56 #include "video/sdl/renderbackendsdl.h"
57 #include "loaders/native/video/imageloader.h"
58 #include "loaders/native/audio/ogg_loader.h"
59 #include "model/model.h"
60 #include "pathfinder/routepather/routepather.h"
61 #include "model/metamodel/grids/hexgrid.h"
62 #include "model/metamodel/grids/squaregrid.h"
63 #include "view/renderers/quadtreerenderer.h"
64 #include "view/renderers/gridrenderer.h"
65 #include "view/renderers/instancerenderer.h"
66 #include "view/renderers/coordinaterenderer.h"
67 #include "view/renderers/floatingtextrenderer.h"
68 #include "view/renderers/cellselectionrenderer.h"
69 #include "view/renderers/blockinginforenderer.h"
70 #include "view/renderers/genericrenderer.h"
71 #include "view/renderers/targetrenderer.h"
72 #include "view/renderers/lightrenderer.h"
73 #include "view/renderers/offrenderer.h"
74 #include "video/image.h"
79 #include <objc/message.h>
82 int32_t main(int32_t argc,
char **argv)
89 static Logger _log(LM_CONTROLLER);
98 m_soundclipmanager(0),
106 m_changelisteners() {
111 cocoa_lib = dlopen(
"/System/Library/Frameworks/Cocoa.framework/Cocoa", RTLD_LAZY );
112 void (*nsappload)(void);
113 nsappload = (void(*)()) dlsym( cocoa_lib,
"NSApplicationLoad");
117 objc_object *NSAutoreleasePool = objc_getClass(
"NSAutoreleasePool");
119 objc_msgSend(NSAutoreleasePool, sel_registerName(
"new"));
133 m_cursor->invalidate();
135 m_imagemanager->invalidateAll();
140 m_guimanager->resizeTopContainer(0,0,mode.getWidth(), mode.getHeight());
143 std::vector<IEngineChangeListener*>::iterator i = m_changelisteners.begin();
144 while (i != m_changelisteners.end()) {
145 (*i)->onScreenModeChanged(mode);
153 FL_LOG(_log,
"================== Engine initialize start =================");
155 FL_LOG(_log,
"Time manager created");
157 FL_LOG(_log,
"Creating VFS");
160 FL_LOG(_log,
"Adding root directory to VFS");
164 FL_LOG(_log,
"Adding zip provider to VFS");
169 FL_LOG(_log,
"Engine pre-init done");
172 if (SDL_Init(SDL_INIT_NOPARACHUTE | SDL_INIT_TIMER) < 0) {
173 throw SDLException(SDL_GetError());
176 SDL_EnableUNICODE(1);
177 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
180 FL_LOG(_log,
"Creating event manager");
185 FL_LOG(_log,
"Creating resource managers");
190 FL_LOG(_log,
"Creating render backend");
192 if (rbackend ==
"SDL") {
194 FL_LOG(_log,
"SDL Render backend created");
197 if (rbackend ==
"OpenGLe") {
199 FL_LOG(_log,
"OpenGLe Render backend created");
200 FL_LOG(_log,
"This is highly experimental so bear in mind some features may not work/work correctly.");
203 FL_LOG(_log,
"OpenGL Render backend created");
209 FL_WARN(_log,
"Tried to select OpenGL, even though it is not compiled into the engine. Falling back to SDL Render backend");
212 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");
262 SDL_EnableUNICODE(1);
264 FL_LOG(_log,
"Creating sound manager");
265 m_soundmanager =
new SoundManager();
266 m_soundmanager->setVolume(static_cast<float>(m_settings.
getInitialVolume()) / 10);
268 FL_LOG(_log,
"Creating renderers");
269 m_offrenderer =
new OffRenderer(m_renderbackend);
270 m_targetrenderer =
new TargetRenderer(m_renderbackend);
271 m_renderers.push_back(
new InstanceRenderer(m_renderbackend, 10));
272 m_renderers.push_back(
new GridRenderer(m_renderbackend, 20));
274 m_renderers.push_back(
new BlockingInfoRenderer(m_renderbackend, 40));
275 m_renderers.push_back(
new FloatingTextRenderer(m_renderbackend, 50));
276 m_renderers.push_back(
new QuadTreeRenderer(m_renderbackend, 60));
277 m_renderers.push_back(
new CoordinateRenderer(m_renderbackend, 70));
278 m_renderers.push_back(
new GenericRenderer(m_renderbackend, 80));
279 m_renderers.push_back(
new LightRenderer(m_renderbackend, 90));
281 FL_LOG(_log,
"Creating model");
282 m_model =
new Model(m_renderbackend, m_renderers);
283 FL_LOG(_log,
"Adding pathers to model");
285 FL_LOG(_log,
"Adding grid prototypes to model");
289 m_cursor =
new Cursor(m_renderbackend);
290 FL_LOG(_log,
"Engine intialized");
300 FL_LOG(_log,
"Destructing engine");
303 delete m_soundmanager;
306 delete m_imagemanager;
307 delete m_soundclipmanager;
311 delete m_offrenderer;
312 delete m_targetrenderer;
313 std::vector<RendererBase*>::iterator rendererIter = m_renderers.begin();
314 for ( ; rendererIter != m_renderers.end(); ++rendererIter)
316 delete *rendererIter;
320 delete m_renderbackend;
322 delete m_timemanager;
328 objc_msgSend(m_autoreleasePool, sel_registerName(
"release"));
331 FL_LOG(_log,
"================== Engine destructed ==================");
344 m_targetrenderer->render();
347 m_offrenderer->render();
353 m_guimanager->turn();
365 m_changelisteners.push_back(listener);
369 std::vector<IEngineChangeListener*>::iterator i = m_changelisteners.begin();
370 while (i != m_changelisteners.end()) {
371 if ((*i) == listener) {
372 m_changelisteners.erase(i);
bool getMouseAcceleration() const
void adoptCellGrid(CellGrid *grid)
void addProvider(VFSSourceProvider *provider)
void addChangeListener(IEngineChangeListener *listener)
bool isColorKeyEnabled() const
virtual void createMainScreen(const ScreenMode &mode, const std::string &title, const std::string &icon)=0
bool isFrameLimitEnabled() const
void setColorKeyEnabled(bool colorkeyenable)
void setFramebufferEnabled(bool enabled)
uint16_t getScreenHeight() const
virtual void init(const std::string &driver)=0
const SDL_Color & getColorKey() const
virtual void clearBackBuffer()=0
const std::string & getWindowTitle() const
uint16_t getScreenWidth() const
EngineSettings & getSettings()
float getMouseSensitivity() const
bool isGLCompressImages() const
virtual void startFrame()
uint32_t getMapCount() const
void setFrameLimit(uint16_t framelimit)
void setNPOTEnabled(bool enabled)
float getInitialVolume() const
const DeviceCaps & getDeviceCaps() const
void removeChangeListener(IEngineChangeListener *listener)
const std::string & getRenderBackend() const
uint8_t getBitsPerPixel() const
void addSource(VFSSource *source)
static LogManager * instance()
uint16_t getFrameLimit() const
bool isGLUseFramebuffer() const
void setFrameLimitEnabled(bool limited)
bool isFullScreen() const
void adoptPather(IPather *pather)
uint32_t getLightingModel() const
void setMouseAcceleration(bool acceleration)
const std::string & getWindowIcon() const
void setMouseSensitivity(float sensitivity)
void setImageCompressingEnabled(bool enabled)
virtual void setScreenMode(const ScreenMode &mode)=0
virtual void setLightingModel(uint32_t lighting)=0
void changeScreenMode(const ScreenMode &mode)