diff --git a/src/Makefile.am b/src/Makefile.am index bdbf8d4af..a774146ac 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -73,6 +73,8 @@ supertuxkart_SOURCES = \ grand_prix_manager.hpp \ graphics/camera.cpp \ graphics/camera.hpp \ + graphics/irr_device.cpp \ + graphics/irr_device.cpp \ graphics/nitro.cpp \ graphics/nitro.hpp \ graphics/moving_texture.hpp \ diff --git a/src/file_manager.cpp b/src/file_manager.cpp index 43576d398..1958911b6 100644 --- a/src/file_manager.cpp +++ b/src/file_manager.cpp @@ -37,12 +37,18 @@ #else # define CONFIGDIR ".supertuxkart" #endif + +#ifdef HAVE_IRRLICHT +# include "irrlicht.h" +#endif // ul.h includes windows.h, so this define is necessary #define _WINSOCKAPI_ - #include #include "btBulletDynamicsCommon.h" +#ifdef HAVE_IRRLICHT +# include "graphics/irr_driver.hpp" +#endif #include "material_manager.hpp" #include "utils/string_utils.hpp" @@ -81,8 +87,21 @@ bool macSetBundlePathIfRelevant(std::string& data_dir) FileManager* file_manager = 0; +/** With irrlicht the constructor creates a NULL device. This is necessary to + * handle the Chicken/egg problem with irrlicht: access to the file system + * is given from the device, but we can't create the device before reading + * the user_config file (for resolution, fullscreen). So we create a dummy + * device here to begin with, which is then later (once the real device + * exists) changed in reInit(). + * + */ FileManager::FileManager() { +#ifdef HAVE_IRRLICHT + // + m_device = createDevice(video::EDT_NULL); + m_file_system = m_device->getFileSystem(); +#endif m_is_full_path = false; if ( getenv ( "SUPERTUXKART_DATADIR" ) != NULL ) @@ -90,9 +109,17 @@ FileManager::FileManager() #ifdef __APPLE__ else if( macSetBundlePathIfRelevant( m_root_dir ) ) { /* nothing to do */ } #endif +#ifdef HAVE_IRRLICHT + else if(m_file_system->existFile("data/stk_config.data")) +#else else if ( access ( "data/stk_config.data", F_OK ) == 0 ) +#endif m_root_dir = "." ; +#ifdef HAVE_IRRLICHT + else if(m_file_system->existFile("../data/stk_config.data")) +#else else if ( access ( "../data/stk_config.data", F_OK ) == 0 ) +#endif m_root_dir = ".." ; else #ifdef SUPERTUXKART_DATADIR @@ -149,12 +176,32 @@ FileManager::FileManager() } } // FileManager +//----------------------------------------------------------------------------- +#ifdef HAVE_IRRLICHT +/** This function is used to re-initialise the file-manager after reading in + * the user configuration data. +*/ +void FileManager::reInit() +{ + // Drop the NULL device + m_device->drop(); + m_device = irr_driver->getDevice(); + m_device->grab(); // To make sure that the device still exists while + // file_manager has a pointer to the file system. + m_file_system = m_device->getFileSystem(); +} // reInit +#endif //----------------------------------------------------------------------------- FileManager::~FileManager() { popMusicSearchPath(); popModelSearchPath(); popTextureSearchPath(); +#ifdef HAVE_IRRLICHT + // m_file_system is ref-counted, so no delete/drop necessary. + m_file_system = NULL; + m_device->drop(); +#endif } // ~FileManager //----------------------------------------------------------------------------- @@ -162,14 +209,20 @@ bool FileManager::findFile(std::string& full_path, const std::string& fname, const std::vector& search_path) const { +#ifndef HAVE_IRRLICHT struct stat mystat; +#endif for(std::vector::const_iterator i = search_path.begin(); i != search_path.end(); ++i) { //full_path=m_root_dir + "/" + *i + "/" + fname; full_path = *i + "/" + fname; +#ifdef HAVE_IRRLICHT + if(m_file_system->existFile(full_path.c_str())) return true; +#else if(stat(full_path.c_str(), &mystat) >= 0) return true; +#endif } full_path=""; return false; @@ -308,23 +361,6 @@ std::string FileManager::getHighscoreFile(const std::string& fname) const { return getHomeDir()+"/"+fname; } // getHighscoreFile -//----------------------------------------------------------------------------- -void FileManager::initConfigDir() -{ -#ifdef WIN32 - /*nothing*/ -#else - /*if HOME environment variable exists - create directory $HOME/.supertuxkart*/ - if(getenv("HOME")!=NULL) - { - std::string pathname; - pathname = getenv("HOME"); - pathname += "/.supertuxkart"; - mkdir(pathname.c_str(), 0755); - } -#endif -} // initConfigDir //----------------------------------------------------------------------------- void FileManager::listFiles(std::set& result, const std::string& dir, diff --git a/src/file_manager.hpp b/src/file_manager.hpp index b18228578..89f4b2549 100644 --- a/src/file_manager.hpp +++ b/src/file_manager.hpp @@ -17,17 +17,29 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -#ifndef HEADER_FILE_MANAGER_H -#define HEADER_FILE_MANAGER_H - +#ifndef HEADER_FILE_MANAGER_HPP +#define HEADER_FILE_MANAGER_HPP #include #include #include -#include "callback_manager.hpp" + +#ifdef HAVE_IRRLICHT +# include "irrlicht.h" + using namespace irr; +#endif class FileManager { private: +#ifdef HAVE_IRRLICHT + /** Handle to irrlicht's file systems. */ + io::IFileSystem *m_file_system; + /** Pointer to the irrlicht device. This is necessary before reInit is + * called to store the NULL device initially created. See Constructor + * for details. */ + IrrlichtDevice *m_device; + +#endif bool m_is_full_path; std::string m_root_dir; std::vector m_texture_search_path, @@ -35,10 +47,17 @@ private: m_music_search_path; bool findFile (std::string& full_path, const std::string& fname, - const std::vector& search_path) const; + const std::vector& search_path) + const; + void makePath (std::string& path, const std::string& dir, + const std::string& fname) const; + public: - FileManager(); - ~FileManager(); + FileManager(); + ~FileManager(); +#ifdef HAVE_IRRLICHT + void reInit(); +#endif std::string getHomeDir () const; std::string getTrackDir () const; @@ -59,10 +78,10 @@ public: std::string getSFXFile (const std::string& fname) const; std::string getFontFile (const std::string& fname) const; std::string getModelFile (const std::string& fname) const; - - void listFiles(std::set& result, const std::string& dir, - bool is_full_path=false, bool make_full_path=false) - const; + void listFiles (std::set& result, + const std::string& dir, + bool is_full_path=false, + bool make_full_path=false) const; void pushTextureSearchPath(const std::string& path) { m_texture_search_path.push_back(path);} @@ -73,13 +92,8 @@ public: void popTextureSearchPath () {m_texture_search_path.pop_back(); } void popModelSearchPath () {m_model_search_path.pop_back(); } void popMusicSearchPath () {m_music_search_path.pop_back(); } - void initConfigDir(); -private: - void makePath (std::string& path, const std::string& dir, - const std::string& fname) const; }; extern FileManager* file_manager; #endif - diff --git a/src/graphics/irr_driver.cpp b/src/graphics/irr_driver.cpp new file mode 100755 index 000000000..86c101b1c --- /dev/null +++ b/src/graphics/irr_driver.cpp @@ -0,0 +1,77 @@ +// $Id: sdldrv.hpp 694 2006-08-29 07:42:36Z hiker $ +// +// SuperTuxKart - a fun racing game with go-kart +// Copyright (C) 2009 Joerg Henrichs +// +// This program 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 3 +// 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +#ifdef HAVE_IRRLICHT + +#include "graphics/irr_driver.hpp" +using namespace core; + +#include "user_config.hpp" + +IrrDriver *irr_driver = NULL; + +IrrDriver::IrrDriver() +{ + // Try different drivers: start with opengl, then DirectX + for(int driver_type=0; driver_type<3; driver_type++) + { + video::E_DRIVER_TYPE type = driver_type==0 + ? video::EDT_OPENGL + : (driver_type==1 + ? video::EDT_DIRECT3D9 + : video::EDT_DIRECT3D8); + // Try 32 and 16 bit per pixels + for(int bits=32; bits>15; bits -=16) + { + m_device = createDevice(type, + dimension2d(user_config->m_width, + user_config->m_height ), + bits, //bits per pixel + user_config->m_fullscreen, + false, // stencil buffers + false, // vsync + this // event receiver + ); + if(m_device) break; + } // for bits=24, 16 + if(m_device) break; + } // for edt_types + if(!m_device) + { + fprintf(stderr, "Couldn't initialise irrlicht device. Quitting.\n"); + exit(-1); + } + +} // IrrDriver + +// ---------------------------------------------------------------------------- +IrrDriver::~IrrDriver() +{ + m_device->drop(); +} // ~IrrDriver + +// ---------------------------------------------------------------------------- +// Irrlicht Event handler. +bool IrrDriver::OnEvent(const irr::SEvent &event) +{ + return false; +} // OnEvent + +// ---------------------------------------------------------------------------- + +#endif // HAVE_IRRLICHT \ No newline at end of file diff --git a/src/graphics/irr_driver.hpp b/src/graphics/irr_driver.hpp new file mode 100755 index 000000000..210ca6156 --- /dev/null +++ b/src/graphics/irr_driver.hpp @@ -0,0 +1,45 @@ +// $Id: sdldrv.hpp 694 2006-08-29 07:42:36Z hiker $ +// +// SuperTuxKart - a fun racing game with go-kart +// Copyright (C) 2009 Joerg Henrichs +// +// This program 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 3 +// 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +#ifdef HAVE_IRRLICHT + +#ifndef HEADER_IRR_DRIVER_HPP +#define HEADER_IRR_DRIVER_HPP + +#include "irrlicht.h" +using namespace irr; + +class IrrDriver : public IEventReceiver +{ +private: + /** The irrlicht device. */ + IrrlichtDevice *m_device; + +public: + IrrDriver(); + ~IrrDriver(); + IrrlichtDevice *getDevice() const { return m_device; } + bool OnEvent(const irr::SEvent &event); +}; // IrrDriver + +extern IrrDriver *irr_driver; + +#endif // HEADER_IRR_DRIVER_HPP + +#endif // HAVE_IRRLICHT \ No newline at end of file diff --git a/src/ide/vc9/supertuxkart.vcproj b/src/ide/vc9/supertuxkart.vcproj index 7aec0be46..ac86a3467 100644 --- a/src/ide/vc9/supertuxkart.vcproj +++ b/src/ide/vc9/supertuxkart.vcproj @@ -42,7 +42,7 @@ Name="VCCLCompilerTool" Optimization="0" WholeProgramOptimization="false" - AdditionalIncludeDirectories="../../../src;../../../src/bullet/src;"$(STK_INCLUDE)";../../../src/enet/include;"C:\cygwin\home\joerg\irrlicht-1.5\include"" + AdditionalIncludeDirectories="../../../src;../../../src/bullet/src;"$(STK_INCLUDE)";../../../src/enet/include;"$(IRR_INCLUDE)"" PreprocessorDefinitions="BT_NO_PROFILE;HAVE_OPENAL;HAVE_OGGVORBIS;_DEBUG;_CONSOLE;WIN32;NOMINMAX;VERSION=\"SVN\";_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE;DEBUG;PACKAGE=\"supertuxkart\";HAVE_GETTEXT;ENABLE_NLS;HAVE_GLUT;HAVE_IRRLICHT" GeneratePreprocessedFile="0" MinimalRebuild="true" @@ -68,7 +68,7 @@ AdditionalDependencies="opengl32.lib user32.lib gdi32.lib winmm.lib advapi32.lib SDL.lib SDLmain.lib OpenAL32.lib libogg.lib libvorbis.lib libvorbisfile.lib sg.lib ssg.lib ul.lib ssgAux.lib fnt.lib intl.lib Irrlicht.lib ws2_32.lib" OutputFile="./../../../$(ProjectName)_irr_d.exe" LinkIncremental="2" - AdditionalLibraryDirectories=""$(STK_LIB)";"C:\cygwin\home\joerg\irrlicht-1.5\lib\Win32-visualstudio"" + AdditionalLibraryDirectories=""$(STK_LIB)";"$(IRR_LIB)"" IgnoreAllDefaultLibraries="false" IgnoreDefaultLibraryNames="libcmt.lib" GenerateDebugInformation="true" @@ -724,6 +724,10 @@ RelativePath="..\..\graphics\camera.cpp" > + + @@ -1422,6 +1426,10 @@ RelativePath="..\..\graphics\camera.hpp" > + + diff --git a/src/main.cpp b/src/main.cpp index 682b6b895..6a22af403 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -59,6 +59,9 @@ #include "audio/sound_manager.hpp" #include "audio/sfx_manager.hpp" #include "challenges/unlock_manager.hpp" +#ifdef HAVE_IRRLICHT +# include "graphics/irr_driver.hpp" +#endif #include "graphics/scene.hpp" #include "gui/menu_manager.hpp" #include "gui/menu_manager.hpp" @@ -433,11 +436,16 @@ void InitTuxkart() { file_manager = new FileManager(); translations = new Translations(); - loader = new Loader(); - loader->setCreateStateCallback(getAppState); // unlock manager is needed when reading the config file unlock_manager = new UnlockManager(); user_config = new UserConfig(); +#ifdef HAVE_IRRLICHT + irr_driver = new IrrDriver(); + // Re-init file manager to use the new device. + file_manager->reInit(); +#endif + loader = new Loader(); + loader->setCreateStateCallback(getAppState); sound_manager = new SoundManager(); sfx_manager = new SFXManager(); // The order here can be important, e.g. KartPropertiesManager needs @@ -505,6 +513,9 @@ void CleanTuxKart() if(translations) delete translations; if(file_manager) delete file_manager; if(stk_scene) delete stk_scene; +#ifdef HAVE_IRRLICHT + if(irr_driver) delete irr_driver; +#endif } //============================================================================= diff --git a/src/sdldrv.cpp b/src/sdldrv.cpp index c9ec714a7..1beee8444 100755 --- a/src/sdldrv.cpp +++ b/src/sdldrv.cpp @@ -355,7 +355,10 @@ SDLDriver::~SDLDriver() // FIXME LEAK: delete m_action_map if defined SDL_FreeSurface(m_main_surface); +#ifndef HAVE_IRRLICHT + // Irrlicht calls SDL_Quit otherwise SDL_Quit(); +#endif } // ~SDLDriver //-----------------------------------------------------------------------------