diff --git a/apps/openmw/CMakeLists.txt b/apps/openmw/CMakeLists.txt index a2ebc1191c..770596c692 100644 --- a/apps/openmw/CMakeLists.txt +++ b/apps/openmw/CMakeLists.txt @@ -64,7 +64,7 @@ add_openmw_dir (mwmechanics ) add_openmw_dir (mwbase - environment + environment world ) # Main executable diff --git a/apps/openmw/mwbase/world.hpp b/apps/openmw/mwbase/world.hpp new file mode 100644 index 0000000000..b2c19ab350 --- /dev/null +++ b/apps/openmw/mwbase/world.hpp @@ -0,0 +1,245 @@ +#ifndef GAME_MWBASE_WORLD_H +#define GAME_MWBASE_WORLD_H + +#include +#include +#include + +#include + +#include "../mwworld/globals.hpp" + +namespace Ogre +{ + class Vector2; + class Vector3; +} + +namespace OEngine +{ + namespace Render + { + class Fader; + } +} + +namespace ESM +{ + class ESMReader; + struct Position; + struct Cell; + struct Class; + struct Potion; +} + +namespace ESMS +{ + struct ESMStore; +} + +namespace MWWorld +{ + class CellStore; + class Player; + class LocalScripts; + class Ptr; + class TimeStamp; +} + +namespace MWBase +{ + class World + { + World (const World&); + ///< not implemented + + World& operator= (const World&); + ///< not implemented + + public: + + enum RenderMode + { + Render_CollisionDebug, + Render_Wireframe, + Render_Pathgrid, + Render_Compositors + }; + + World() {} + + virtual ~World() {} + + virtual OEngine::Render::Fader* getFader() = 0; + ///< \ŧodo remove this function. Rendering details should not be exposed. + + virtual MWWorld::CellStore *getExterior (int x, int y) = 0; + + virtual MWWorld::CellStore *getInterior (const std::string& name) = 0; + + virtual void setWaterHeight(const float height) = 0; + + virtual void toggleWater() = 0; + + virtual void adjustSky() = 0; + + virtual void getTriangleBatchCount(unsigned int &triangles, unsigned int &batches) = 0; + + virtual void setFallbackValues (const std::map& fallbackMap) = 0; + + virtual std::string getFallback (const std::string& key) const = 0; + + virtual std::string getFallback (const std::string& key, const std::string& def) const = 0; + + virtual MWWorld::Player& getPlayer() = 0; + + virtual const ESMS::ESMStore& getStore() const = 0; + + virtual ESM::ESMReader& getEsmReader() = 0; + + virtual MWWorld::LocalScripts& getLocalScripts() = 0; + + virtual bool hasCellChanged() const = 0; + ///< Has the player moved to a different cell, since the last frame? + + virtual bool isCellExterior() const = 0; + + virtual bool isCellQuasiExterior() const = 0; + + virtual Ogre::Vector2 getNorthVector (MWWorld::CellStore* cell) = 0; + ///< get north vector (OGRE coordinates) for given interior cell + + virtual MWWorld::Globals::Data& getGlobalVariable (const std::string& name) = 0; + + virtual MWWorld::Globals::Data getGlobalVariable (const std::string& name) const = 0; + + virtual char getGlobalVariableType (const std::string& name) const = 0; + ///< Return ' ', if there is no global variable with this name. + + virtual MWWorld::Ptr getPtr (const std::string& name, bool activeOnly) = 0; + ///< Return a pointer to a liveCellRef with the given name. + /// \param activeOnly do non search inactive cells. + + virtual MWWorld::Ptr getPtrViaHandle (const std::string& handle) = 0; + ///< Return a pointer to a liveCellRef with the given Ogre handle. + + /// \todo enable reference in the OGRE scene + virtual void enable (const MWWorld::Ptr& ptr) = 0; + + /// \todo disable reference in the OGRE scene + virtual void disable (const MWWorld::Ptr& ptr) = 0; + + virtual void advanceTime (double hours) = 0; + ///< Advance in-game time. + + virtual void setHour (double hour) = 0; + ///< Set in-game time hour. + + virtual void setMonth (int month) = 0; + ///< Set in-game time month. + + virtual void setDay (int day) = 0; + ///< Set in-game time day. + + virtual MWWorld::TimeStamp getTimeStamp() const = 0; + ///< Return current in-game time stamp. + + virtual bool toggleSky() = 0; + ///< \return Resulting mode + + virtual void changeWeather(const std::string& region, unsigned int id) = 0; + + virtual int getCurrentWeather() const = 0; + + virtual int getMasserPhase() const = 0; + + virtual int getSecundaPhase() const = 0; + + virtual void setMoonColour (bool red) = 0; + + virtual float getTimeScaleFactor() const = 0; + + virtual void changeToInteriorCell (const std::string& cellName, + const ESM::Position& position) = 0; + ///< Move to interior cell. + + virtual void changeToExteriorCell (const ESM::Position& position) = 0; + ///< Move to exterior cell. + + virtual const ESM::Cell *getExterior (const std::string& cellName) const = 0; + ///< Return a cell matching the given name or a 0-pointer, if there is no such cell. + + virtual void markCellAsUnchanged() = 0; + + virtual std::string getFacedHandle() = 0; + ///< Return handle of the object the player is looking at + + virtual void deleteObject (const MWWorld::Ptr& ptr) = 0; + + virtual void moveObject (const MWWorld::Ptr& ptr, float x, float y, float z) = 0; + + virtual void indexToPosition (int cellX, int cellY, float &x, float &y, bool centre = false) + const = 0; + ///< Convert cell numbers to position. + + virtual void positionToIndex (float x, float y, int &cellX, int &cellY) const = 0; + ///< Convert position to cell numbers + + virtual void doPhysics (const std::vector >& actors, + float duration) = 0; + ///< Run physics simulation and modify \a world accordingly. + + virtual bool toggleCollisionMode() = 0; + ///< Toggle collision mode for player. If disabled player object should ignore + /// collisions and gravity. + ///< \return Resulting mode + + virtual bool toggleRenderMode (RenderMode mode) = 0; + ///< Toggle a render mode. + ///< \return Resulting mode + + virtual std::pair createRecord (const ESM::Potion& record) + = 0; + ///< Create a new recrod (of type potion) in the ESM store. + /// \return ID, pointer to created record + + virtual std::pair createRecord (const ESM::Class& record) + = 0; + ///< Create a new recrod (of type class) in the ESM store. + /// \return ID, pointer to created record + + virtual const ESM::Cell *createRecord (const ESM::Cell& record) = 0; + ///< Create a new recrod (of type cell) in the ESM store. + /// \return ID, pointer to created record + + virtual void playAnimationGroup (const MWWorld::Ptr& ptr, const std::string& groupName, + int mode, int number = 1) = 0; + ///< Run animation for a MW-reference. Calls to this function for references that are + /// currently not in the rendered scene should be ignored. + /// + /// \param mode: 0 normal, 1 immediate start, 2 immediate loop + /// \param number How offen the animation should be run + + virtual void skipAnimation (const MWWorld::Ptr& ptr) = 0; + ///< Skip the animation for the given MW-reference for one frame. Calls to this function for + /// references that are currently not in the rendered scene should be ignored. + + virtual void update (float duration) = 0; + + virtual bool placeObject(const MWWorld::Ptr& object, float cursorX, float cursorY) = 0; + ///< place an object into the gameworld at the specified cursor position + /// @param object + /// @param cursor X (relative 0-1) + /// @param cursor Y (relative 0-1) + /// @return true if the object was placed, or false if it was rejected because the position is too far away + + virtual void dropObjectOnGround (const MWWorld::Ptr& object) = 0; + + virtual bool canPlaceObject (float cursorX, float cursorY) = 0; + ///< @return true if it is possible to place on object at specified cursor location + + virtual void processChangedSettings (const Settings::CategorySettingVector& settings) = 0; + }; +} + +#endif diff --git a/apps/openmw/mwworld/world.cpp b/apps/openmw/mwworld/world.cpp index e5633814f8..b0067eabf5 100644 --- a/apps/openmw/mwworld/world.cpp +++ b/apps/openmw/mwworld/world.cpp @@ -154,19 +154,19 @@ namespace MWWorld mRendering->skyDisable(); } - void World::setFallbackValues(std::map fallbackMap) + void World::setFallbackValues (const std::map& fallbackMap) { mFallback = fallbackMap; } - std::string World::getFallback(std::string key) + std::string World::getFallback (const std::string& key) const { return getFallback(key, ""); } - std::string World::getFallback(std::string key, std::string def) + std::string World::getFallback (const std::string& key, const std::string& def) const { - std::map::iterator it; + std::map::const_iterator it; if((it = mFallback.find(key)) == mFallback.end()) { return def; @@ -351,7 +351,7 @@ namespace MWWorld throw std::runtime_error ("unknown Ogre handle: " + handle); } - void World::enable (Ptr reference) + void World::enable (const Ptr& reference) { if (!reference.getRefData().isEnabled()) { @@ -362,7 +362,7 @@ namespace MWWorld } } - void World::disable (Ptr reference) + void World::disable (const Ptr& reference) { if (reference.getRefData().isEnabled()) { @@ -537,7 +537,7 @@ namespace MWWorld } } - void World::deleteObject (Ptr ptr) + void World::deleteObject (const Ptr& ptr) { if (ptr.getRefData().getCount()>0) { @@ -552,7 +552,7 @@ namespace MWWorld } } - bool World::moveObjectImp (Ptr ptr, float x, float y, float z) + bool World::moveObjectImp (const Ptr& ptr, float x, float y, float z) { bool ret = false; ptr.getRefData().getPosition().pos[0] = x; @@ -590,7 +590,7 @@ namespace MWWorld return ret; } - void World::moveObject (Ptr ptr, float x, float y, float z) + void World::moveObject (const Ptr& ptr, float x, float y, float z) { moveObjectImp(ptr, x, y, z); @@ -753,6 +753,8 @@ namespace MWWorld void World::update (float duration) { + /// \todo split this function up into subfunctions + mWorldScene->update (duration); mWeatherManager->update (duration); @@ -959,7 +961,7 @@ namespace MWWorld return mRendering->getFader(); } - Ogre::Vector2 World::getNorthVector(Ptr::CellStore* cell) + Ogre::Vector2 World::getNorthVector (CellStore* cell) { MWWorld::CellRefList statics = cell->statics; MWWorld::LiveCellRef* ref = statics.find("northmarker"); @@ -981,14 +983,14 @@ namespace MWWorld mRendering->toggleWater(); } - bool World::placeObject(MWWorld::Ptr object, float cursorX, float cursorY) + bool World::placeObject (const Ptr& object, float cursorX, float cursorY) { std::pair result = mPhysics->castRay(cursorX, cursorY); if (!result.first) return false; - MWWorld::Ptr::CellStore* cell; + CellStore* cell; if (isCellExterior()) { int cellX, cellY; @@ -1021,7 +1023,7 @@ namespace MWWorld return true; } - void World::dropObjectOnGround(MWWorld::Ptr object) + void World::dropObjectOnGround (const Ptr& object) { MWWorld::Ptr::CellStore* cell = getPlayer().getPlayer().getCell(); diff --git a/apps/openmw/mwworld/world.hpp b/apps/openmw/mwworld/world.hpp index f0da56b659..526a2d7a6a 100644 --- a/apps/openmw/mwworld/world.hpp +++ b/apps/openmw/mwworld/world.hpp @@ -25,6 +25,8 @@ #include +#include "../mwbase/world.hpp" + namespace Ogre { class Vector3; @@ -58,20 +60,8 @@ namespace MWWorld /// \brief The game world and its visual representation - class World + class World : public MWBase::World { - public: - - enum RenderMode - { - Render_CollisionDebug, - Render_Wireframe, - Render_Pathgrid, - Render_Compositors - }; - - private: - MWRender::RenderingManager* mRendering; MWWorld::WeatherManager* mWeatherManager; @@ -109,180 +99,183 @@ namespace MWWorld int getDaysPerMonth (int month) const; - bool moveObjectImp (Ptr ptr, float x, float y, float z); + bool moveObjectImp (const Ptr& ptr, float x, float y, float z); ///< @return true if the active cell (cell player is in) changed public: - World (OEngine::Render::OgreRenderer& renderer, + World (OEngine::Render::OgreRenderer& renderer, const Files::Collections& fileCollections, const std::string& master, const boost::filesystem::path& resDir, bool newGame, const std::string& encoding, std::map fallbackMap); - ~World(); + virtual ~World(); - OEngine::Render::Fader* getFader(); + virtual OEngine::Render::Fader* getFader(); + ///< \ŧodo remove this function. Rendering details should not be exposed. - Ptr::CellStore *getExterior (int x, int y); + virtual CellStore *getExterior (int x, int y); - Ptr::CellStore *getInterior (const std::string& name); + virtual CellStore *getInterior (const std::string& name); - void setWaterHeight(const float height); - void toggleWater(); + virtual void setWaterHeight(const float height); - void adjustSky(); + virtual void toggleWater(); - void getTriangleBatchCount(unsigned int &triangles, unsigned int &batches); + virtual void adjustSky(); - void setFallbackValues(std::map fallbackMap); + virtual void getTriangleBatchCount(unsigned int &triangles, unsigned int &batches); - std::string getFallback(std::string key); + virtual void setFallbackValues (const std::map& fallbackMap); - std::string getFallback(std::string key, std::string def); + virtual std::string getFallback (const std::string& key) const; - MWWorld::Player& getPlayer(); + virtual std::string getFallback (const std::string& key, const std::string& def) const; - const ESMS::ESMStore& getStore() const; + virtual Player& getPlayer(); - ESM::ESMReader& getEsmReader(); + virtual const ESMS::ESMStore& getStore() const; - LocalScripts& getLocalScripts(); + virtual ESM::ESMReader& getEsmReader(); - bool hasCellChanged() const; + virtual LocalScripts& getLocalScripts(); + + virtual bool hasCellChanged() const; ///< Has the player moved to a different cell, since the last frame? - bool isCellExterior() const; - bool isCellQuasiExterior() const; + virtual bool isCellExterior() const; - Ogre::Vector2 getNorthVector(Ptr::CellStore* cell); + virtual bool isCellQuasiExterior() const; + + virtual Ogre::Vector2 getNorthVector (CellStore* cell); ///< get north vector (OGRE coordinates) for given interior cell - Globals::Data& getGlobalVariable (const std::string& name); + virtual Globals::Data& getGlobalVariable (const std::string& name); - Globals::Data getGlobalVariable (const std::string& name) const; + virtual Globals::Data getGlobalVariable (const std::string& name) const; - char getGlobalVariableType (const std::string& name) const; + virtual char getGlobalVariableType (const std::string& name) const; ///< Return ' ', if there is no global variable with this name. - Ptr getPtr (const std::string& name, bool activeOnly); + virtual Ptr getPtr (const std::string& name, bool activeOnly); ///< Return a pointer to a liveCellRef with the given name. /// \param activeOnly do non search inactive cells. - Ptr getPtrViaHandle (const std::string& handle); + virtual Ptr getPtrViaHandle (const std::string& handle); ///< Return a pointer to a liveCellRef with the given Ogre handle. - /// \todo enable reference in the OGRE scene - void enable (Ptr reference); + virtual void enable (const Ptr& ptr); - /// \todo 5disable reference in the OGRE scene - void disable (Ptr reference); + virtual void disable (const Ptr& ptr); - void advanceTime (double hours); + virtual void advanceTime (double hours); ///< Advance in-game time. - void setHour (double hour); + virtual void setHour (double hour); ///< Set in-game time hour. - void setMonth (int month); + virtual void setMonth (int month); ///< Set in-game time month. - void setDay (int day); + virtual void setDay (int day); ///< Set in-game time day. - TimeStamp getTimeStamp() const; + virtual TimeStamp getTimeStamp() const; ///< Return current in-game time stamp. - bool toggleSky(); + virtual bool toggleSky(); ///< \return Resulting mode - void changeWeather(const std::string& region, const unsigned int id); + virtual void changeWeather (const std::string& region, const unsigned int id); - int getCurrentWeather() const; + virtual int getCurrentWeather() const; - int getMasserPhase() const; + virtual int getMasserPhase() const; - int getSecundaPhase() const; + virtual int getSecundaPhase() const; - void setMoonColour (bool red); + virtual void setMoonColour (bool red); - float getTimeScaleFactor() const; + virtual float getTimeScaleFactor() const; - void changeToInteriorCell (const std::string& cellName, const ESM::Position& position); + virtual void changeToInteriorCell (const std::string& cellName, + const ESM::Position& position); ///< Move to interior cell. - void changeToExteriorCell (const ESM::Position& position); + virtual void changeToExteriorCell (const ESM::Position& position); ///< Move to exterior cell. - const ESM::Cell *getExterior (const std::string& cellName) const; + virtual const ESM::Cell *getExterior (const std::string& cellName) const; ///< Return a cell matching the given name or a 0-pointer, if there is no such cell. - void markCellAsUnchanged(); + virtual void markCellAsUnchanged(); - std::string getFacedHandle(); + virtual std::string getFacedHandle(); ///< Return handle of the object the player is looking at - void deleteObject (Ptr ptr); + virtual void deleteObject (const Ptr& ptr); - void moveObject (Ptr ptr, float x, float y, float z); + virtual void moveObject (const Ptr& ptr, float x, float y, float z); - void indexToPosition (int cellX, int cellY, float &x, float &y, bool centre = false) const; + virtual void indexToPosition (int cellX, int cellY, float &x, float &y, bool centre = false) + const; ///< Convert cell numbers to position. - void positionToIndex (float x, float y, int &cellX, int &cellY) const; + virtual void positionToIndex (float x, float y, int &cellX, int &cellY) const; ///< Convert position to cell numbers - void doPhysics (const std::vector >& actors, + virtual void doPhysics (const std::vector >& actors, float duration); ///< Run physics simulation and modify \a world accordingly. - bool toggleCollisionMode(); + virtual bool toggleCollisionMode(); ///< Toggle collision mode for player. If disabled player object should ignore /// collisions and gravity. ///< \return Resulting mode - bool toggleRenderMode (RenderMode mode); + virtual bool toggleRenderMode (RenderMode mode); ///< Toggle a render mode. ///< \return Resulting mode - std::pair createRecord (const ESM::Potion& record); + virtual std::pair createRecord (const ESM::Potion& record); ///< Create a new recrod (of type potion) in the ESM store. /// \return ID, pointer to created record - std::pair createRecord (const ESM::Class& record); + virtual std::pair createRecord (const ESM::Class& record); ///< Create a new recrod (of type class) in the ESM store. /// \return ID, pointer to created record - const ESM::Cell *createRecord (const ESM::Cell& record); + virtual const ESM::Cell *createRecord (const ESM::Cell& record); ///< Create a new recrod (of type cell) in the ESM store. /// \return ID, pointer to created record - void playAnimationGroup (const MWWorld::Ptr& ptr, const std::string& groupName, int mode, - int number = 1); + virtual void playAnimationGroup (const MWWorld::Ptr& ptr, const std::string& groupName, + int mode, int number = 1); ///< Run animation for a MW-reference. Calls to this function for references that are /// currently not in the rendered scene should be ignored. /// /// \param mode: 0 normal, 1 immediate start, 2 immediate loop /// \param number How offen the animation should be run - void skipAnimation (const MWWorld::Ptr& ptr); + virtual void skipAnimation (const MWWorld::Ptr& ptr); ///< Skip the animation for the given MW-reference for one frame. Calls to this function for /// references that are currently not in the rendered scene should be ignored. - void update (float duration); + virtual void update (float duration); - bool placeObject(MWWorld::Ptr object, float cursorX, float cursorY); + virtual bool placeObject (const Ptr& object, float cursorX, float cursorY); ///< place an object into the gameworld at the specified cursor position /// @param object /// @param cursor X (relative 0-1) /// @param cursor Y (relative 0-1) /// @return true if the object was placed, or false if it was rejected because the position is too far away - void dropObjectOnGround(MWWorld::Ptr object); + virtual void dropObjectOnGround (const Ptr& object); - bool canPlaceObject(float cursorX, float cursorY); + virtual bool canPlaceObject(float cursorX, float cursorY); ///< @return true if it is possible to place on object at specified cursor location - void processChangedSettings(const Settings::CategorySettingVector& settings); + virtual void processChangedSettings(const Settings::CategorySettingVector& settings); }; }