1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-05 18:45:34 +00:00

Merge branch 'environment' into 'master'

Make Environment a storage of referencing pointers instead of owned

See merge request OpenMW/openmw!1830
This commit is contained in:
psi29a 2022-05-08 08:47:34 +00:00
commit 49487a17e6
24 changed files with 254 additions and 312 deletions

View file

@ -271,7 +271,7 @@ namespace
void OMW::Engine::executeLocalScripts() void OMW::Engine::executeLocalScripts()
{ {
MWWorld::LocalScripts& localScripts = mEnvironment.getWorld()->getLocalScripts(); MWWorld::LocalScripts& localScripts = mWorld->getLocalScripts();
localScripts.startIteration(); localScripts.startIteration();
std::pair<std::string, MWWorld::Ptr> script; std::pair<std::string, MWWorld::Ptr> script;
@ -279,7 +279,7 @@ void OMW::Engine::executeLocalScripts()
{ {
MWScript::InterpreterContext interpreterContext ( MWScript::InterpreterContext interpreterContext (
&script.second.getRefData().getLocals(), script.second); &script.second.getRefData().getLocals(), script.second);
mEnvironment.getScriptManager()->run (script.first, interpreterContext); mScriptManager->run (script.first, interpreterContext);
} }
} }
@ -297,7 +297,7 @@ bool OMW::Engine::frame(float frametime)
// update input // update input
{ {
ScopedProfile<UserStatsType::Input> profile(frameStart, frameNumber, *timer, *stats); ScopedProfile<UserStatsType::Input> profile(frameStart, frameNumber, *timer, *stats);
mEnvironment.getInputManager()->update(frametime, false); mInputManager->update(frametime, false);
} }
// When the window is minimized, pause the game. Currently this *has* to be here to work around a MyGUI bug. // When the window is minimized, pause the game. Currently this *has* to be here to work around a MyGUI bug.
@ -306,21 +306,21 @@ bool OMW::Engine::frame(float frametime)
{ {
ScopedProfile<UserStatsType::Sound> profile(frameStart, frameNumber, *timer, *stats); ScopedProfile<UserStatsType::Sound> profile(frameStart, frameNumber, *timer, *stats);
if (!mEnvironment.getWindowManager()->isWindowVisible()) if (!mWindowManager->isWindowVisible())
{ {
mEnvironment.getSoundManager()->pausePlayback(); mSoundManager->pausePlayback();
return false; return false;
} }
else else
mEnvironment.getSoundManager()->resumePlayback(); mSoundManager->resumePlayback();
// sound // sound
if (mUseSound) if (mUseSound)
mEnvironment.getSoundManager()->update(frametime); mSoundManager->update(frametime);
} }
// Main menu opened? Then scripts are also paused. // Main menu opened? Then scripts are also paused.
bool paused = mEnvironment.getWindowManager()->containsMode(MWGui::GM_MainMenu); bool paused = mWindowManager->containsMode(MWGui::GM_MainMenu);
// Should be called after input manager update and before any change to the game world. // Should be called after input manager update and before any change to the game world.
// It applies to the game world queued changes from the previous frame. // It applies to the game world queued changes from the previous frame.
@ -329,35 +329,35 @@ bool OMW::Engine::frame(float frametime)
// update game state // update game state
{ {
ScopedProfile<UserStatsType::State> profile(frameStart, frameNumber, *timer, *stats); ScopedProfile<UserStatsType::State> profile(frameStart, frameNumber, *timer, *stats);
mEnvironment.getStateManager()->update (frametime); mStateManager->update (frametime);
} }
bool guiActive = mEnvironment.getWindowManager()->isGuiMode(); bool guiActive = mWindowManager->isGuiMode();
{ {
ScopedProfile<UserStatsType::Script> profile(frameStart, frameNumber, *timer, *stats); ScopedProfile<UserStatsType::Script> profile(frameStart, frameNumber, *timer, *stats);
if (mEnvironment.getStateManager()->getState() != MWBase::StateManager::State_NoGame) if (mStateManager->getState() != MWBase::StateManager::State_NoGame)
{ {
if (!paused) if (!paused)
{ {
if (mEnvironment.getWorld()->getScriptsEnabled()) if (mWorld->getScriptsEnabled())
{ {
// local scripts // local scripts
executeLocalScripts(); executeLocalScripts();
// global scripts // global scripts
mEnvironment.getScriptManager()->getGlobalScripts().run(); mScriptManager->getGlobalScripts().run();
} }
mEnvironment.getWorld()->markCellAsUnchanged(); mWorld->markCellAsUnchanged();
} }
if (!guiActive) if (!guiActive)
{ {
double hours = (frametime * mEnvironment.getWorld()->getTimeScaleFactor()) / 3600.0; double hours = (frametime * mWorld->getTimeScaleFactor()) / 3600.0;
mEnvironment.getWorld()->advanceTime(hours, true); mWorld->advanceTime(hours, true);
mEnvironment.getWorld()->rechargeItems(frametime, true); mWorld->rechargeItems(frametime, true);
} }
} }
} }
@ -366,16 +366,16 @@ bool OMW::Engine::frame(float frametime)
{ {
ScopedProfile<UserStatsType::Mechanics> profile(frameStart, frameNumber, *timer, *stats); ScopedProfile<UserStatsType::Mechanics> profile(frameStart, frameNumber, *timer, *stats);
if (mEnvironment.getStateManager()->getState() != MWBase::StateManager::State_NoGame) if (mStateManager->getState() != MWBase::StateManager::State_NoGame)
{ {
mEnvironment.getMechanicsManager()->update(frametime, guiActive); mMechanicsManager->update(frametime, guiActive);
} }
if (mEnvironment.getStateManager()->getState() == MWBase::StateManager::State_Running) if (mStateManager->getState() == MWBase::StateManager::State_Running)
{ {
MWWorld::Ptr player = mEnvironment.getWorld()->getPlayerPtr(); MWWorld::Ptr player = mWorld->getPlayerPtr();
if(!guiActive && player.getClass().getCreatureStats(player).isDead()) if(!guiActive && player.getClass().getCreatureStats(player).isDead())
mEnvironment.getStateManager()->endGame(); mStateManager->endGame();
} }
} }
@ -383,9 +383,9 @@ bool OMW::Engine::frame(float frametime)
{ {
ScopedProfile<UserStatsType::Physics> profile(frameStart, frameNumber, *timer, *stats); ScopedProfile<UserStatsType::Physics> profile(frameStart, frameNumber, *timer, *stats);
if (mEnvironment.getStateManager()->getState() != MWBase::StateManager::State_NoGame) if (mStateManager->getState() != MWBase::StateManager::State_NoGame)
{ {
mEnvironment.getWorld()->updatePhysics(frametime, guiActive, frameStart, frameNumber, *stats); mWorld->updatePhysics(frametime, guiActive, frameStart, frameNumber, *stats);
} }
} }
@ -393,16 +393,16 @@ bool OMW::Engine::frame(float frametime)
{ {
ScopedProfile<UserStatsType::World> profile(frameStart, frameNumber, *timer, *stats); ScopedProfile<UserStatsType::World> profile(frameStart, frameNumber, *timer, *stats);
if (mEnvironment.getStateManager()->getState() != MWBase::StateManager::State_NoGame) if (mStateManager->getState() != MWBase::StateManager::State_NoGame)
{ {
mEnvironment.getWorld()->update(frametime, guiActive); mWorld->update(frametime, guiActive);
} }
} }
// update GUI // update GUI
{ {
ScopedProfile<UserStatsType::Gui> profile(frameStart, frameNumber, *timer, *stats); ScopedProfile<UserStatsType::Gui> profile(frameStart, frameNumber, *timer, *stats);
mEnvironment.getWindowManager()->update(frametime); mWindowManager->update(frametime);
} }
if (stats->collectStats("resource")) if (stats->collectStats("resource"))
@ -443,7 +443,6 @@ OMW::Engine::Engine(Files::ConfigurationManager& configurationManager)
, mExportFonts(false) , mExportFonts(false)
, mRandomSeed(0) , mRandomSeed(0)
, mScriptContext (nullptr) , mScriptContext (nullptr)
, mLuaManager (nullptr)
, mFSStrict (false) , mFSStrict (false)
, mScriptBlacklistUse (true) , mScriptBlacklistUse (true)
, mNewGame (false) , mNewGame (false)
@ -471,6 +470,17 @@ OMW::Engine::~Engine()
mEnvironment.cleanup(); mEnvironment.cleanup();
mMechanicsManager = nullptr;
mDialogueManager = nullptr;
mJournal = nullptr;
mScriptManager = nullptr;
mWindowManager = nullptr;
mWorld = nullptr;
mSoundManager = nullptr;
mInputManager = nullptr;
mStateManager = nullptr;
mLuaManager = nullptr;
delete mScriptContext; delete mScriptContext;
mScriptContext = nullptr; mScriptContext = nullptr;
@ -701,8 +711,8 @@ void OMW::Engine::setWindowIcon()
void OMW::Engine::prepareEngine (Settings::Manager & settings) void OMW::Engine::prepareEngine (Settings::Manager & settings)
{ {
mEnvironment.setStateManager ( mStateManager = std::make_unique<MWState::StateManager>(mCfgMgr.getUserDataPath() / "saves", mContentFiles);
std::make_unique<MWState::StateManager> (mCfgMgr.getUserDataPath() / "saves", mContentFiles)); mEnvironment.setStateManager(*mStateManager);
mStereoManager = std::make_unique<Stereo::Manager>(mViewer); mStereoManager = std::make_unique<Stereo::Manager>(mViewer);
@ -723,6 +733,7 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings)
Settings::Manager::getString("texture mipmap", "General"), Settings::Manager::getString("texture mipmap", "General"),
Settings::Manager::getInt("anisotropy", "General") Settings::Manager::getInt("anisotropy", "General")
); );
mEnvironment.setResourceSystem(*mResourceSystem);
int numThreads = Settings::Manager::getInt("preload num threads", "Cells"); int numThreads = Settings::Manager::getInt("preload num threads", "Cells");
if (numThreads <= 0) if (numThreads <= 0)
@ -744,9 +755,8 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings)
mViewer->addEventHandler(mScreenCaptureHandler); mViewer->addEventHandler(mScreenCaptureHandler);
auto luaMgr = std::make_unique<MWLua::LuaManager>(mVFS.get(), (mResDir / "lua_libs").string()); mLuaManager = std::make_unique<MWLua::LuaManager>(mVFS.get(), (mResDir / "lua_libs").string());
mLuaManager = luaMgr.get(); mEnvironment.setLuaManager(*mLuaManager);
mEnvironment.setLuaManager(std::move(luaMgr));
// Create input and UI first to set up a bootstrapping environment for // Create input and UI first to set up a bootstrapping environment for
// showing a loading screen and keeping the window responsive while doing so // showing a loading screen and keeping the window responsive while doing so
@ -799,34 +809,36 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings)
mStereoManager->disableStereoForNode(guiRoot); mStereoManager->disableStereoForNode(guiRoot);
rootNode->addChild(guiRoot); rootNode->addChild(guiRoot);
auto windowMgr = std::make_unique<MWGui::WindowManager>(mWindow, mViewer, guiRoot, mResourceSystem.get(), mWorkQueue.get(), mWindowManager = std::make_unique<MWGui::WindowManager>(mWindow, mViewer, guiRoot, mResourceSystem.get(), mWorkQueue.get(),
mCfgMgr.getLogPath().string() + std::string("/"), myguiResources, mCfgMgr.getLogPath().string() + std::string("/"), myguiResources,
mScriptConsoleMode, mTranslationDataStorage, mEncoding, mExportFonts, mScriptConsoleMode, mTranslationDataStorage, mEncoding, mExportFonts,
Version::getOpenmwVersionDescription(mResDir.string()), mCfgMgr.getUserConfigPath().string(), shadersSupported); Version::getOpenmwVersionDescription(mResDir.string()), mCfgMgr.getUserConfigPath().string(), shadersSupported);
auto* windowMgrInternal = windowMgr.get(); mEnvironment.setWindowManager(*mWindowManager);
mEnvironment.setWindowManager (std::move(windowMgr));
auto inputMgr = std::make_unique<MWInput::InputManager>(mWindow, mViewer, mScreenCaptureHandler, mScreenCaptureOperation, keybinderUser, keybinderUserExists, userGameControllerdb, gameControllerdb, mGrab); mInputManager = std::make_unique<MWInput::InputManager>(mWindow, mViewer, mScreenCaptureHandler,
mEnvironment.setInputManager(std::move(inputMgr)); mScreenCaptureOperation, keybinderUser, keybinderUserExists, userGameControllerdb, gameControllerdb, mGrab);
mEnvironment.setInputManager(*mInputManager);
// Create sound system // Create sound system
mEnvironment.setSoundManager (std::make_unique<MWSound::SoundManager>(mVFS.get(), mUseSound)); mSoundManager = std::make_unique<MWSound::SoundManager>(mVFS.get(), mUseSound);
mEnvironment.setSoundManager(*mSoundManager);
if (!mSkipMenu) if (!mSkipMenu)
{ {
const std::string& logo = Fallback::Map::getString("Movies_Company_Logo"); const std::string& logo = Fallback::Map::getString("Movies_Company_Logo");
if (!logo.empty()) if (!logo.empty())
mEnvironment.getWindowManager()->playVideo(logo, true); mWindowManager->playVideo(logo, true);
} }
// Create the world // Create the world
mEnvironment.setWorld(std::make_unique<MWWorld::World>(mViewer, rootNode, mResourceSystem.get(), mWorkQueue.get(), mWorld = std::make_unique<MWWorld::World>(mViewer, rootNode, mResourceSystem.get(), mWorkQueue.get(),
mFileCollections, mContentFiles, mGroundcoverFiles, mEncoder, mActivationDistanceOverride, mCellName, mFileCollections, mContentFiles, mGroundcoverFiles, mEncoder, mActivationDistanceOverride, mCellName,
mStartupScript, mResDir.string(), mCfgMgr.getUserDataPath().string())); mStartupScript, mResDir.string(), mCfgMgr.getUserDataPath().string());
mEnvironment.getWorld()->setupPlayer(); mWorld->setupPlayer();
mEnvironment.setWorld(*mWorld);
windowMgrInternal->setStore(mEnvironment.getWorld()->getStore()); mWindowManager->setStore(mWorld->getStore());
windowMgrInternal->initUI(); mWindowManager->initUI();
//Load translation data //Load translation data
mTranslationDataStorage.setEncoder(mEncoder); mTranslationDataStorage.setEncoder(mEncoder);
@ -839,21 +851,25 @@ void OMW::Engine::prepareEngine (Settings::Manager & settings)
mScriptContext = new MWScript::CompilerContext (MWScript::CompilerContext::Type_Full); mScriptContext = new MWScript::CompilerContext (MWScript::CompilerContext::Type_Full);
mScriptContext->setExtensions (&mExtensions); mScriptContext->setExtensions (&mExtensions);
mEnvironment.setScriptManager (std::make_unique<MWScript::ScriptManager>(mEnvironment.getWorld()->getStore(), *mScriptContext, mWarningsMode, mScriptManager = std::make_unique<MWScript::ScriptManager>(mWorld->getStore(), *mScriptContext, mWarningsMode,
mScriptBlacklistUse ? mScriptBlacklist : std::vector<std::string>())); mScriptBlacklistUse ? mScriptBlacklist : std::vector<std::string>());
mEnvironment.setScriptManager(*mScriptManager);
// Create game mechanics system // Create game mechanics system
mEnvironment.setMechanicsManager (std::make_unique<MWMechanics::MechanicsManager>()); mMechanicsManager = std::make_unique<MWMechanics::MechanicsManager>();
mEnvironment.setMechanicsManager(*mMechanicsManager);
// Create dialog system // Create dialog system
mEnvironment.setJournal (std::make_unique<MWDialogue::Journal>()); mJournal = std::make_unique<MWDialogue::Journal>();
mEnvironment.setDialogueManager (std::make_unique<MWDialogue::DialogueManager>(mExtensions, mTranslationDataStorage)); mEnvironment.setJournal(*mJournal);
mEnvironment.setResourceSystem(mResourceSystem.get());
mDialogueManager = std::make_unique<MWDialogue::DialogueManager>(mExtensions, mTranslationDataStorage);
mEnvironment.setDialogueManager(*mDialogueManager);
// scripts // scripts
if (mCompileAll) if (mCompileAll)
{ {
std::pair<int, int> result = mEnvironment.getScriptManager()->compileAll(); std::pair<int, int> result = mScriptManager->compileAll();
if (result.first) if (result.first)
Log(Debug::Info) Log(Debug::Info)
<< "compiled " << result.second << " of " << result.first << " scripts (" << "compiled " << result.second << " of " << result.first << " scripts ("
@ -1014,25 +1030,25 @@ void OMW::Engine::go()
// Start the game // Start the game
if (!mSaveGameFile.empty()) if (!mSaveGameFile.empty())
{ {
mEnvironment.getStateManager()->loadGame(mSaveGameFile); mStateManager->loadGame(mSaveGameFile);
} }
else if (!mSkipMenu) else if (!mSkipMenu)
{ {
// start in main menu // start in main menu
mEnvironment.getWindowManager()->pushGuiMode (MWGui::GM_MainMenu); mWindowManager->pushGuiMode (MWGui::GM_MainMenu);
mEnvironment.getSoundManager()->playTitleMusic(); mSoundManager->playTitleMusic();
const std::string& logo = Fallback::Map::getString("Movies_Morrowind_Logo"); const std::string& logo = Fallback::Map::getString("Movies_Morrowind_Logo");
if (!logo.empty()) if (!logo.empty())
mEnvironment.getWindowManager()->playVideo(logo, true); mWindowManager->playVideo(logo, true);
} }
else else
{ {
mEnvironment.getStateManager()->newGame (!mNewGame); mStateManager->newGame (!mNewGame);
} }
if (!mStartupScript.empty() && mEnvironment.getStateManager()->getState() == MWState::StateManager::State_Running) if (!mStartupScript.empty() && mStateManager->getState() == MWState::StateManager::State_Running)
{ {
mEnvironment.getWindowManager()->executeInConsole(mStartupScript); mWindowManager->executeInConsole(mStartupScript);
} }
LuaWorker luaWorker(this); // starts a separate lua thread if "lua num threads" > 0 LuaWorker luaWorker(this); // starts a separate lua thread if "lua num threads" > 0
@ -1041,7 +1057,7 @@ void OMW::Engine::go()
double simulationTime = 0.0; double simulationTime = 0.0;
Misc::FrameRateLimiter frameRateLimiter = Misc::makeFrameRateLimiter(mEnvironment.getFrameRateLimit()); Misc::FrameRateLimiter frameRateLimiter = Misc::makeFrameRateLimiter(mEnvironment.getFrameRateLimit());
const std::chrono::steady_clock::duration maxSimulationInterval(std::chrono::milliseconds(200)); const std::chrono::steady_clock::duration maxSimulationInterval(std::chrono::milliseconds(200));
while (!mViewer->done() && !mEnvironment.getStateManager()->hasQuitRequest()) while (!mViewer->done() && !mStateManager->hasQuitRequest())
{ {
const double dt = std::chrono::duration_cast<std::chrono::duration<double>>(std::min( const double dt = std::chrono::duration_cast<std::chrono::duration<double>>(std::min(
frameRateLimiter.getLastFrameDuration(), frameRateLimiter.getLastFrameDuration(),
@ -1060,7 +1076,7 @@ void OMW::Engine::go()
mViewer->eventTraversal(); mViewer->eventTraversal();
mViewer->updateTraversal(); mViewer->updateTraversal();
mEnvironment.getWorld()->updateWindowManager(); mWorld->updateWindowManager();
luaWorker.allowUpdate(); // if there is a separate Lua thread, it starts the update now luaWorker.allowUpdate(); // if there is a separate Lua thread, it starts the update now
@ -1068,7 +1084,7 @@ void OMW::Engine::go()
luaWorker.finishUpdate(); luaWorker.finishUpdate();
bool guiActive = mEnvironment.getWindowManager()->isGuiMode(); bool guiActive = mWindowManager->isGuiMode();
if (!guiActive) if (!guiActive)
simulationTime += dt; simulationTime += dt;
} }

View file

@ -64,6 +64,51 @@ namespace SceneUtil
} }
} }
namespace MWState
{
class StateManager;
}
namespace MWGui
{
class WindowManager;
}
namespace MWInput
{
class InputManager;
}
namespace MWSound
{
class SoundManager;
}
namespace MWWorld
{
class World;
}
namespace MWScript
{
class ScriptManager;
}
namespace MWMechanics
{
class MechanicsManager;
}
namespace MWDialogue
{
class DialogueManager;
}
namespace MWDialogue
{
class Journal;
}
struct SDL_Window; struct SDL_Window;
namespace OMW namespace OMW
@ -75,6 +120,16 @@ namespace OMW
std::unique_ptr<VFS::Manager> mVFS; std::unique_ptr<VFS::Manager> mVFS;
std::unique_ptr<Resource::ResourceSystem> mResourceSystem; std::unique_ptr<Resource::ResourceSystem> mResourceSystem;
osg::ref_ptr<SceneUtil::WorkQueue> mWorkQueue; osg::ref_ptr<SceneUtil::WorkQueue> mWorkQueue;
std::unique_ptr<MWWorld::World> mWorld;
std::unique_ptr<MWSound::SoundManager> mSoundManager;
std::unique_ptr<MWScript::ScriptManager> mScriptManager;
std::unique_ptr<MWGui::WindowManager> mWindowManager;
std::unique_ptr<MWMechanics::MechanicsManager> mMechanicsManager;
std::unique_ptr<MWDialogue::DialogueManager> mDialogueManager;
std::unique_ptr<MWDialogue::Journal> mJournal;
std::unique_ptr<MWInput::InputManager> mInputManager;
std::unique_ptr<MWState::StateManager> mStateManager;
std::unique_ptr<MWLua::LuaManager> mLuaManager;
MWBase::Environment mEnvironment; MWBase::Environment mEnvironment;
ToUTF8::FromType mEncoding; ToUTF8::FromType mEncoding;
ToUTF8::Utf8Encoder* mEncoder; ToUTF8::Utf8Encoder* mEncoder;
@ -111,8 +166,6 @@ namespace OMW
Compiler::Extensions mExtensions; Compiler::Extensions mExtensions;
Compiler::Context *mScriptContext; Compiler::Context *mScriptContext;
MWLua::LuaManager* mLuaManager;
Files::Collections mFileCollections; Files::Collections mFileCollections;
bool mFSStrict; bool mFSStrict;
Translation::Storage mTranslationDataStorage; Translation::Storage mTranslationDataStorage;

View file

@ -19,7 +19,7 @@ MWBase::Environment *MWBase::Environment::sThis = nullptr;
MWBase::Environment::Environment() MWBase::Environment::Environment()
{ {
assert(!sThis); assert(sThis == nullptr);
sThis = this; sThis = this;
} }
@ -28,167 +28,21 @@ MWBase::Environment::~Environment()
sThis = nullptr; sThis = nullptr;
} }
void MWBase::Environment::setWorld (std::unique_ptr<World>&& world)
{
mWorld = std::move(world);
}
void MWBase::Environment::setSoundManager (std::unique_ptr<SoundManager>&& soundManager)
{
mSoundManager = std::move(soundManager);
}
void MWBase::Environment::setScriptManager (std::unique_ptr<ScriptManager>&& scriptManager)
{
mScriptManager = std::move(scriptManager);
}
void MWBase::Environment::setWindowManager (std::unique_ptr<WindowManager>&& windowManager)
{
mWindowManager = std::move(windowManager);
}
void MWBase::Environment::setMechanicsManager (std::unique_ptr<MechanicsManager>&& mechanicsManager)
{
mMechanicsManager = std::move(mechanicsManager);
}
void MWBase::Environment::setDialogueManager (std::unique_ptr<DialogueManager>&& dialogueManager)
{
mDialogueManager = std::move(dialogueManager);
}
void MWBase::Environment::setJournal (std::unique_ptr<Journal>&& journal)
{
mJournal = std::move(journal);
}
void MWBase::Environment::setInputManager (std::unique_ptr<InputManager>&& inputManager)
{
mInputManager = std::move(inputManager);
}
void MWBase::Environment::setStateManager (std::unique_ptr<StateManager>&& stateManager)
{
mStateManager = std::move(stateManager);
}
void MWBase::Environment::setLuaManager (std::unique_ptr<LuaManager>&& luaManager)
{
mLuaManager = std::move(luaManager);
}
void MWBase::Environment::setResourceSystem (Resource::ResourceSystem *resourceSystem)
{
mResourceSystem = resourceSystem;
}
void MWBase::Environment::setFrameDuration (float duration)
{
mFrameDuration = duration;
}
void MWBase::Environment::setFrameRateLimit(float limit)
{
mFrameRateLimit = limit;
}
float MWBase::Environment::getFrameRateLimit() const
{
return mFrameRateLimit;
}
MWBase::World *MWBase::Environment::getWorld() const
{
assert (mWorld);
return mWorld.get();
}
MWBase::SoundManager *MWBase::Environment::getSoundManager() const
{
assert (mSoundManager);
return mSoundManager.get();
}
MWBase::ScriptManager *MWBase::Environment::getScriptManager() const
{
assert (mScriptManager);
return mScriptManager.get();
}
MWBase::WindowManager *MWBase::Environment::getWindowManager() const
{
assert (mWindowManager);
return mWindowManager.get();
}
MWBase::MechanicsManager *MWBase::Environment::getMechanicsManager() const
{
assert (mMechanicsManager);
return mMechanicsManager.get();
}
MWBase::DialogueManager *MWBase::Environment::getDialogueManager() const
{
assert (mDialogueManager);
return mDialogueManager.get();
}
MWBase::Journal *MWBase::Environment::getJournal() const
{
assert (mJournal);
return mJournal.get();
}
MWBase::InputManager *MWBase::Environment::getInputManager() const
{
assert (mInputManager);
return mInputManager.get();
}
MWBase::StateManager *MWBase::Environment::getStateManager() const
{
assert (mStateManager);
return mStateManager.get();
}
MWBase::LuaManager *MWBase::Environment::getLuaManager() const
{
assert (mLuaManager);
return mLuaManager.get();
}
Resource::ResourceSystem *MWBase::Environment::getResourceSystem() const
{
return mResourceSystem;
}
float MWBase::Environment::getFrameDuration() const
{
return mFrameDuration;
}
void MWBase::Environment::cleanup() void MWBase::Environment::cleanup()
{ {
mMechanicsManager.reset(); mMechanicsManager = nullptr;
mDialogueManager.reset(); mDialogueManager = nullptr;
mJournal.reset(); mJournal = nullptr;
mScriptManager.reset(); mScriptManager = nullptr;
mWindowManager.reset(); mWindowManager = nullptr;
mWorld.reset(); mWorld = nullptr;
mSoundManager.reset(); mSoundManager = nullptr;
mInputManager.reset(); mInputManager = nullptr;
mStateManager.reset(); mStateManager = nullptr;
mLuaManager.reset(); mLuaManager = nullptr;
mResourceSystem = nullptr; mResourceSystem = nullptr;
} }
const MWBase::Environment& MWBase::Environment::get()
{
assert (sThis);
return *sThis;
}
void MWBase::Environment::reportStats(unsigned int frameNumber, osg::Stats& stats) const void MWBase::Environment::reportStats(unsigned int frameNumber, osg::Stats& stats) const
{ {
mMechanicsManager->reportStats(frameNumber, stats); mMechanicsManager->reportStats(frameNumber, stats);

View file

@ -1,6 +1,8 @@
#ifndef GAME_BASE_ENVIRONMENT_H #ifndef GAME_BASE_ENVIRONMENT_H
#define GAME_BASE_ENVIRONMENT_H #define GAME_BASE_ENVIRONMENT_H
#include <components/misc/notnullptr.hpp>
#include <memory> #include <memory>
namespace osg namespace osg
@ -34,25 +36,19 @@ namespace MWBase
{ {
static Environment *sThis; static Environment *sThis;
std::unique_ptr<World> mWorld; World* mWorld = nullptr;
std::unique_ptr<SoundManager> mSoundManager; SoundManager* mSoundManager = nullptr;
std::unique_ptr<ScriptManager> mScriptManager; ScriptManager* mScriptManager = nullptr;
std::unique_ptr<WindowManager> mWindowManager; WindowManager* mWindowManager = nullptr;
std::unique_ptr<MechanicsManager> mMechanicsManager; MechanicsManager* mMechanicsManager = nullptr;
std::unique_ptr<DialogueManager> mDialogueManager; DialogueManager* mDialogueManager = nullptr;
std::unique_ptr<Journal> mJournal; Journal* mJournal = nullptr;
std::unique_ptr<InputManager> mInputManager; InputManager* mInputManager = nullptr;
std::unique_ptr<StateManager> mStateManager; StateManager* mStateManager = nullptr;
std::unique_ptr<LuaManager> mLuaManager; LuaManager* mLuaManager = nullptr;
Resource::ResourceSystem* mResourceSystem{}; Resource::ResourceSystem* mResourceSystem = nullptr;
float mFrameDuration{}; float mFrameRateLimit = 0;
float mFrameRateLimit{}; float mFrameDuration = 0;
Environment (const Environment&);
///< not implemented
Environment& operator= (const Environment&);
///< not implemented
public: public:
@ -60,63 +56,70 @@ namespace MWBase
~Environment(); ~Environment();
void setWorld (std::unique_ptr<World>&& world); Environment(const Environment&) = delete;
void setSoundManager (std::unique_ptr<SoundManager>&& soundManager); Environment& operator=(const Environment&) = delete;
void setScriptManager (std::unique_ptr<ScriptManager>&& scriptManager); void setWorld(World& value) { mWorld = &value; }
void setWindowManager (std::unique_ptr<WindowManager>&& windowManager); void setSoundManager(SoundManager& value) { mSoundManager = &value; }
void setMechanicsManager (std::unique_ptr<MechanicsManager>&& mechanicsManager); void setScriptManager(ScriptManager& value) { mScriptManager = &value; }
void setDialogueManager (std::unique_ptr<DialogueManager>&& dialogueManager); void setWindowManager(WindowManager& value) { mWindowManager = &value; }
void setJournal (std::unique_ptr<Journal>&& journal); void setMechanicsManager(MechanicsManager& value) { mMechanicsManager = &value; }
void setInputManager (std::unique_ptr<InputManager>&& inputManager); void setDialogueManager(DialogueManager& value) { mDialogueManager = &value; }
void setStateManager (std::unique_ptr<StateManager>&& stateManager); void setJournal(Journal& value) { mJournal = &value; }
void setLuaManager (std::unique_ptr<LuaManager>&& luaManager); void setInputManager(InputManager& value) { mInputManager = &value; }
void setResourceSystem (Resource::ResourceSystem *resourceSystem); void setStateManager(StateManager& value) { mStateManager = &value; }
void setFrameDuration (float duration); void setLuaManager(LuaManager& value) { mLuaManager = &value; }
///< Set length of current frame in seconds.
void setFrameRateLimit(float frameRateLimit); void setResourceSystem(Resource::ResourceSystem& value) { mResourceSystem = &value; }
float getFrameRateLimit() const;
World *getWorld() const; Misc::NotNullPtr<World> getWorld() const { return mWorld; }
SoundManager *getSoundManager() const; Misc::NotNullPtr<SoundManager> getSoundManager() const { return mSoundManager; }
ScriptManager *getScriptManager() const; Misc::NotNullPtr<ScriptManager> getScriptManager() const { return mScriptManager; }
WindowManager *getWindowManager() const; Misc::NotNullPtr<WindowManager> getWindowManager() const { return mWindowManager; }
MechanicsManager *getMechanicsManager() const; Misc::NotNullPtr<MechanicsManager> getMechanicsManager() const { return mMechanicsManager; }
DialogueManager *getDialogueManager() const; Misc::NotNullPtr<DialogueManager> getDialogueManager() const { return mDialogueManager; }
Journal *getJournal() const; Misc::NotNullPtr<Journal> getJournal() const { return mJournal; }
InputManager *getInputManager() const; Misc::NotNullPtr<InputManager> getInputManager() const { return mInputManager; }
StateManager *getStateManager() const; Misc::NotNullPtr<StateManager> getStateManager() const { return mStateManager; }
LuaManager *getLuaManager() const; Misc::NotNullPtr<LuaManager> getLuaManager() const { return mLuaManager; }
Resource::ResourceSystem *getResourceSystem() const; Misc::NotNullPtr<Resource::ResourceSystem> getResourceSystem() const { return mResourceSystem; }
float getFrameDuration() const; float getFrameRateLimit() const { return mFrameRateLimit; }
void setFrameRateLimit(float value) { mFrameRateLimit = value; }
float getFrameDuration() const { return mFrameDuration; }
void setFrameDuration(float value) { mFrameDuration = value; }
void cleanup(); void cleanup();
///< Delete all mw*-subsystems.
static const Environment& get(); /// Return instance of this class.
///< Return instance of this class. static const Environment& get()
{
assert(sThis != nullptr);
return *sThis;
}
void reportStats(unsigned int frameNumber, osg::Stats& stats) const; void reportStats(unsigned int frameNumber, osg::Stats& stats) const;
}; };

View file

@ -66,12 +66,6 @@ namespace MWBase
virtual void drop (const MWWorld::CellStore *cellStore) = 0; virtual void drop (const MWWorld::CellStore *cellStore) = 0;
///< Deregister all objects in the given cell. ///< Deregister all objects in the given cell.
virtual void update (float duration, bool paused) = 0;
///< Update objects
///
/// \param paused In game type does not currently advance (this usually means some GUI
/// component is up).
virtual void setPlayerName (const std::string& name) = 0; virtual void setPlayerName (const std::string& name) = 0;
///< Set player name. ///< Set player name.

View file

@ -176,8 +176,6 @@ namespace MWBase
virtual void pausePlayback() = 0; virtual void pausePlayback() = 0;
virtual void resumePlayback() = 0; virtual void resumePlayback() = 0;
virtual void update(float duration) = 0;
virtual void setListenerPosDir(const osg::Vec3f &pos, const osg::Vec3f &dir, const osg::Vec3f &up, bool underwater) = 0; virtual void setListenerPosDir(const osg::Vec3f &pos, const osg::Vec3f &dir, const osg::Vec3f &up, bool underwater) = 0;
virtual void updatePtr(const MWWorld::ConstPtr& old, const MWWorld::ConstPtr& updated) = 0; virtual void updatePtr(const MWWorld::ConstPtr& old, const MWWorld::ConstPtr& updated) = 0;

View file

@ -88,8 +88,6 @@ namespace MWBase
/// iterator. /// iterator.
virtual CharacterIterator characterEnd() = 0; virtual CharacterIterator characterEnd() = 0;
virtual void update (float duration) = 0;
}; };
} }

View file

@ -247,8 +247,6 @@ namespace MWBase
/// returns the index of the pressed button or -1 if no button was pressed (->MessageBoxmanager->InteractiveMessageBox) /// returns the index of the pressed button or -1 if no button was pressed (->MessageBoxmanager->InteractiveMessageBox)
virtual int readPressedButton() = 0; virtual int readPressedButton() = 0;
virtual void update (float duration) = 0;
virtual void updateConsoleObjectPtr(const MWWorld::Ptr& currentPtr, const MWWorld::Ptr& newPtr) = 0; virtual void updateConsoleObjectPtr(const MWWorld::Ptr& currentPtr, const MWWorld::Ptr& newPtr) = 0;
/** /**

View file

@ -408,11 +408,6 @@ namespace MWBase
///< Write this record to the ESM store, allowing it to override a pre-existing record with the same ID. ///< Write this record to the ESM store, allowing it to override a pre-existing record with the same ID.
/// \return pointer to created record /// \return pointer to created record
virtual void update (float duration, bool paused) = 0;
virtual void updatePhysics (float duration, bool paused, osg::Timer_t frameStart, unsigned int frameNumber, osg::Stats& stats) = 0;
virtual void updateWindowManager () = 0;
virtual MWWorld::Ptr placeObject (const MWWorld::ConstPtr& object, float cursorX, float cursorY, int amount) = 0; virtual MWWorld::Ptr placeObject (const MWWorld::ConstPtr& object, float cursorX, float cursorY, int amount) = 0;
///< copy and place an object into the gameworld at the specified cursor position ///< copy and place an object into the gameworld at the specified cursor position
/// @param object /// @param object

View file

@ -277,7 +277,7 @@ namespace MWGui
int readPressedButton () override; ///< returns the index of the pressed button or -1 if no button was pressed (->MessageBoxmanager->InteractiveMessageBox) int readPressedButton () override; ///< returns the index of the pressed button or -1 if no button was pressed (->MessageBoxmanager->InteractiveMessageBox)
void update (float duration) override; void update (float duration);
/** /**
* Fetches a GMST string from the store, if there is no setting with the given * Fetches a GMST string from the store, if there is no setting with the given

View file

@ -157,8 +157,8 @@ namespace MWInput
void ActionManager::executeAction(int action) void ActionManager::executeAction(int action)
{ {
MWBase::Environment::get().getLuaManager()->inputEvent({MWBase::LuaManager::InputEvent::Action, action}); MWBase::Environment::get().getLuaManager()->inputEvent({MWBase::LuaManager::InputEvent::Action, action});
auto* inputManager = MWBase::Environment::get().getInputManager(); const auto inputManager = MWBase::Environment::get().getInputManager();
auto* windowManager = MWBase::Environment::get().getWindowManager(); const auto windowManager = MWBase::Environment::get().getWindowManager();
// trigger action activated // trigger action activated
switch (action) switch (action)
{ {

View file

@ -61,7 +61,7 @@ namespace MWInput
/// Clear all savegame-specific data /// Clear all savegame-specific data
void clear() override; void clear() override;
void update(float dt, bool disableControls=false, bool disableEvents=false) override; void update(float dt, bool disableControls, bool disableEvents=false) override;
void changeInputMode(bool guiMode) override; void changeInputMode(bool guiMode) override;

View file

@ -200,7 +200,7 @@ namespace MWLua
}; };
api["setConsoleSelectedObject"] = [luaManager=context.mLuaManager](const sol::object& obj) api["setConsoleSelectedObject"] = [luaManager=context.mLuaManager](const sol::object& obj)
{ {
auto* wm = MWBase::Environment::get().getWindowManager(); const auto wm = MWBase::Environment::get().getWindowManager();
if (obj == sol::nil) if (obj == sol::nil)
luaManager->addAction([wm]{ wm->setConsoleSelectedObject(MWWorld::Ptr()); }); luaManager->addAction([wm]{ wm->setConsoleSelectedObject(MWWorld::Ptr()); });
else else

View file

@ -495,7 +495,7 @@ namespace MWMechanics
getActorsSidingWith(actor1, allies1, cachedAllies); getActorsSidingWith(actor1, allies1, cachedAllies);
auto* mechanicsManager = MWBase::Environment::get().getMechanicsManager(); const auto mechanicsManager = MWBase::Environment::get().getMechanicsManager();
// If an ally of actor1 has been attacked by actor2 or has attacked actor2, start combat between actor1 and actor2 // If an ally of actor1 has been attacked by actor2 or has attacked actor2, start combat between actor1 and actor2
for (const MWWorld::Ptr& ally : allies1) for (const MWWorld::Ptr& ally : allies1)
{ {
@ -583,7 +583,7 @@ namespace MWMechanics
} }
// Make guards go aggressive with creatures that are in combat, unless the creature is a follower or escorter // Make guards go aggressive with creatures that are in combat, unless the creature is a follower or escorter
auto* world = MWBase::Environment::get().getWorld(); const auto world = MWBase::Environment::get().getWorld();
if (!aggressive && actor1.getClass().isClass(actor1, "Guard") && !actor2.getClass().isNpc() && creatureStats2.getAiSequence().isInCombat()) if (!aggressive && actor1.getClass().isClass(actor1, "Guard") && !actor2.getClass().isNpc() && creatureStats2.getAiSequence().isInCombat())
{ {
// Check if the creature is too far // Check if the creature is too far
@ -917,7 +917,7 @@ namespace MWMechanics
//If holding a light... //If holding a light...
if(heldIter.getType() == MWWorld::ContainerStore::Type_Light) if(heldIter.getType() == MWWorld::ContainerStore::Type_Light)
{ {
auto* world = MWBase::Environment::get().getWorld(); const auto world = MWBase::Environment::get().getWorld();
// Use time from the player's light // Use time from the player's light
if(isPlayer) if(isPlayer)
{ {
@ -974,8 +974,8 @@ namespace MWMechanics
if (playerStats.isWerewolf()) if (playerStats.isWerewolf())
return; return;
auto* mechanicsManager = MWBase::Environment::get().getMechanicsManager(); const auto mechanicsManager = MWBase::Environment::get().getMechanicsManager();
auto* world = MWBase::Environment::get().getWorld(); const auto world = MWBase::Environment::get().getWorld();
if (actorClass.isClass(ptr, "Guard") && creatureStats.getAiSequence().isInPursuit() && !creatureStats.getAiSequence().isInCombat() if (actorClass.isClass(ptr, "Guard") && creatureStats.getAiSequence().isInPursuit() && !creatureStats.getAiSequence().isInCombat()
&& creatureStats.getMagicEffects().get(ESM::MagicEffect::CalmHumanoid).getMagnitude() == 0) && creatureStats.getMagicEffects().get(ESM::MagicEffect::CalmHumanoid).getMagnitude() == 0)

View file

@ -207,7 +207,7 @@ std::string CharacterController::chooseRandomGroup (const std::string& prefix, i
void CharacterController::refreshHitRecoilAnims(CharacterState& idle) void CharacterController::refreshHitRecoilAnims(CharacterState& idle)
{ {
auto* world = MWBase::Environment::get().getWorld(); const auto world = MWBase::Environment::get().getWorld();
auto& charClass = mPtr.getClass(); auto& charClass = mPtr.getClass();
auto& stats = charClass.getCreatureStats(mPtr); auto& stats = charClass.getCreatureStats(mPtr);
bool recovery = stats.getHitRecovery(); bool recovery = stats.getHitRecovery();
@ -1101,7 +1101,7 @@ void CharacterController::updateIdleStormState(bool inwater)
return; return;
} }
auto* world = MWBase::Environment::get().getWorld(); const auto world = MWBase::Environment::get().getWorld();
if (world->isInStorm()) if (world->isInStorm())
{ {
osg::Vec3f stormDirection = world->getStormDirection(); osg::Vec3f stormDirection = world->getStormDirection();
@ -1139,7 +1139,7 @@ bool CharacterController::updateCarriedLeftVisible(const int weaptype) const
bool CharacterController::updateState(CharacterState idle) bool CharacterController::updateState(CharacterState idle)
{ {
auto* world = MWBase::Environment::get().getWorld(); const auto world = MWBase::Environment::get().getWorld();
auto& prng = world->getPrng(); auto& prng = world->getPrng();
MWBase::SoundManager* sndMgr = MWBase::Environment::get().getSoundManager(); MWBase::SoundManager* sndMgr = MWBase::Environment::get().getSoundManager();

View file

@ -54,7 +54,7 @@ namespace MWMechanics
void drop(const MWWorld::CellStore *cellStore) override; void drop(const MWWorld::CellStore *cellStore) override;
///< Deregister all objects in the given cell. ///< Deregister all objects in the given cell.
void update (float duration, bool paused) override; void update(float duration, bool paused);
///< Update objects ///< Update objects
/// ///
/// \param paused In game type does not currently advance (this usually means some GUI /// \param paused In game type does not currently advance (this usually means some GUI

View file

@ -789,7 +789,7 @@ namespace MWPhysics
void PhysicsSystem::moveActors() void PhysicsSystem::moveActors()
{ {
auto* player = getActor(MWMechanics::getPlayer()); auto* player = getActor(MWMechanics::getPlayer());
auto* world = MWBase::Environment::get().getWorld(); const auto world = MWBase::Environment::get().getWorld();
// copy new ptr position in temporary vector. player is handled separately as its movement might change active cell. // copy new ptr position in temporary vector. player is handled separately as its movement might change active cell.
std::vector<std::pair<MWWorld::Ptr, osg::Vec3f>> newPositions; std::vector<std::pair<MWWorld::Ptr, osg::Vec3f>> newPositions;

View file

@ -25,7 +25,7 @@ osg::ref_ptr<ESMTerrain::LandObject> LandManager::getLand(int x, int y)
return static_cast<ESMTerrain::LandObject*>(obj.get()); return static_cast<ESMTerrain::LandObject*>(obj.get());
else else
{ {
const auto* world = MWBase::Environment::get().getWorld(); const auto world = MWBase::Environment::get().getWorld();
if (!world) if (!world)
return nullptr; return nullptr;
const ESM::Land* land = world->getStore().get<ESM::Land>().search(x,y); const ESM::Land* land = world->getStore().get<ESM::Land>().search(x,y);

View file

@ -804,7 +804,7 @@ namespace MWRender
} }
else if (mode == Render_Scene) else if (mode == Render_Scene)
{ {
auto* wm = MWBase::Environment::get().getWindowManager(); const auto wm = MWBase::Environment::get().getWindowManager();
unsigned int mask = wm->getCullMask(); unsigned int mask = wm->getCullMask();
bool enabled = !(mask&sToggleWorldMask); bool enabled = !(mask&sToggleWorldMask);
if (enabled) if (enabled)

View file

@ -244,7 +244,7 @@ namespace MWSound
void pausePlayback() override; void pausePlayback() override;
void resumePlayback() override; void resumePlayback() override;
void update(float duration) override; void update(float duration);
void setListenerPosDir(const osg::Vec3f &pos, const osg::Vec3f &dir, const osg::Vec3f &up, bool underwater) override; void setListenerPosDir(const osg::Vec3f &pos, const osg::Vec3f &dir, const osg::Vec3f &up, bool underwater) override;

View file

@ -84,7 +84,7 @@ namespace MWState
CharacterIterator characterEnd() override; CharacterIterator characterEnd() override;
void update (float duration) override; void update(float duration);
}; };
} }

View file

@ -522,11 +522,11 @@ namespace MWWorld
void Player::update() void Player::update()
{ {
auto player = getPlayer(); auto player = getPlayer();
auto* world = MWBase::Environment::get().getWorld(); const auto world = MWBase::Environment::get().getWorld();
auto* rendering = world->getRenderingManager(); const auto rendering = world->getRenderingManager();
auto& store = world->getStore(); auto& store = world->getStore();
auto& playerClass = player.getClass(); auto& playerClass = player.getClass();
auto* windowMgr = MWBase::Environment::get().getWindowManager(); const auto windowMgr = MWBase::Environment::get().getWindowManager();
if (player.getCell()->isExterior()) if (player.getCell()->isExterior())
{ {

View file

@ -495,10 +495,10 @@ namespace MWWorld
///< Write this record to the ESM store, allowing it to override a pre-existing record with the same ID. ///< Write this record to the ESM store, allowing it to override a pre-existing record with the same ID.
/// \return pointer to created record /// \return pointer to created record
void update (float duration, bool paused) override; void update(float duration, bool paused);
void updatePhysics (float duration, bool paused, osg::Timer_t frameStart, unsigned int frameNumber, osg::Stats& stats) override; void updatePhysics(float duration, bool paused, osg::Timer_t frameStart, unsigned int frameNumber, osg::Stats& stats);
void updateWindowManager () override; void updateWindowManager();
MWWorld::Ptr placeObject (const MWWorld::ConstPtr& object, float cursorX, float cursorY, int amount) override; MWWorld::Ptr placeObject (const MWWorld::ConstPtr& object, float cursorX, float cursorY, int amount) override;
///< copy and place an object into the gameworld at the specified cursor position ///< copy and place an object into the gameworld at the specified cursor position

View file

@ -0,0 +1,33 @@
#ifndef OPENMW_COMPONENTS_MISC_NOTNULLPTR_H
#define OPENMW_COMPONENTS_MISC_NOTNULLPTR_H
#include <cassert>
#include <cstddef>
#include <type_traits>
namespace Misc
{
template <class T>
class NotNullPtr
{
public:
NotNullPtr(T* value)
: mValue(value)
{
assert(mValue != nullptr);
}
NotNullPtr(std::nullptr_t) = delete;
operator T*() const { return mValue; }
T* operator->() const { return mValue; }
T& operator*() const { return *mValue; }
private:
T* mValue;
};
}
#endif