mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-05 15:45:33 +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:
commit
49487a17e6
24 changed files with 254 additions and 312 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -88,8 +88,6 @@ namespace MWBase
|
||||||
/// iterator.
|
/// iterator.
|
||||||
|
|
||||||
virtual CharacterIterator characterEnd() = 0;
|
virtual CharacterIterator characterEnd() = 0;
|
||||||
|
|
||||||
virtual void update (float duration) = 0;
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -84,7 +84,7 @@ namespace MWState
|
||||||
|
|
||||||
CharacterIterator characterEnd() override;
|
CharacterIterator characterEnd() override;
|
||||||
|
|
||||||
void update (float duration) override;
|
void update(float duration);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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())
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
33
components/misc/notnullptr.hpp
Normal file
33
components/misc/notnullptr.hpp
Normal 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
|
Loading…
Reference in a new issue