openmw-tes3coop/apps/openmw/mwgui/loadingscreen.cpp

122 lines
3.5 KiB
C++
Raw Normal View History

2012-09-11 14:37:54 +00:00
#include "loadingscreen.hpp"
#include <OgreRenderWindow.h>
#include <OgreRoot.h>
#include "../mwbase/environment.hpp"
#include "../mwbase/inputmanager.hpp"
namespace MWGui
{
LoadingScreen::LoadingScreen(Ogre::SceneManager* sceneMgr, Ogre::RenderWindow* rw, MWBase::WindowManager& parWindowManager)
: mSceneMgr(sceneMgr)
, mWindow(rw)
, WindowBase("openmw_loading_screen.layout", parWindowManager)
, mLoadingOn(false)
, mLastRenderTime(0.f)
{
getWidget(mLoadingText, "LoadingText");
getWidget(mProgressBar, "ProgressBar");
2012-09-11 14:37:54 +00:00
}
LoadingScreen::~LoadingScreen()
{
}
void LoadingScreen::setLoadingProgress (const std::string& stage, int depth, int current, int total)
{
if (!mLoadingOn)
loadingOn();
const int numRefLists = 20;
2012-09-11 14:37:54 +00:00
if (depth == 0)
{
mCurrentCellLoading = current;
mTotalCellsLoading = total;
mCurrentRefLoading = 0;
mCurrentRefList = 0;
2012-09-11 14:37:54 +00:00
}
else if (depth == 1)
2012-09-11 14:37:54 +00:00
{
mCurrentRefLoading = current;
mTotalRefsLoading = total;
}
if (mTotalCellsLoading == 0)
{
loadingOff();
return;
}
float refProgress;
if (mTotalRefsLoading <= 1)
refProgress = 1;
2012-09-11 14:37:54 +00:00
else
refProgress = float(mCurrentRefLoading) / float(mTotalRefsLoading-1);
refProgress += mCurrentRefList;
refProgress /= numRefLists;
assert(refProgress <= 1 && refProgress >= 0);
if (depth == 1 && mCurrentRefLoading == mTotalRefsLoading-1)
++mCurrentRefList;
2012-09-11 14:37:54 +00:00
float progress = (float(mCurrentCellLoading)+refProgress) / float(mTotalCellsLoading);
assert(progress <= 1 && progress >= 0);
if (progress >= 1)
{
loadingOff();
return;
}
mLoadingText->setCaption(stage + "... ");
mProgressBar->setProgressPosition (static_cast<size_t>(progress * 1000));
2012-09-11 14:37:54 +00:00
static float loadingScreenFps = 30.f;
2012-09-11 14:37:54 +00:00
if (mTimer.getMilliseconds () > mLastRenderTime + (1.f/loadingScreenFps) * 1000.f)
2012-09-11 14:37:54 +00:00
{
mLastRenderTime = mTimer.getMilliseconds ();
// Turn off rendering except the GUI
mSceneMgr->clearSpecialCaseRenderQueues();
// SCRQM_INCLUDE with RENDER_QUEUE_OVERLAY does not work.
for (int i = 0; i < Ogre::RENDER_QUEUE_MAX; ++i)
{
if (i > 0 && i < 90)
2012-09-11 14:37:54 +00:00
mSceneMgr->addSpecialCaseRenderQueue(i);
}
mSceneMgr->setSpecialCaseRenderQueueMode(Ogre::SceneManager::SCRQM_EXCLUDE);
// always update input before rendering something, otherwise mygui goes crazy when something was entered in the frame before
// (e.g. when using "coc" console command, it would enter an infinite loop and crash due to overflow)
MWBase::Environment::get().getInputManager()->update(0, true);
mWindow->getViewport(0)->setClearEveryFrame(false);
2012-09-11 14:37:54 +00:00
mWindow->update();
mWindow->getViewport(0)->setClearEveryFrame(true);
2012-09-11 14:37:54 +00:00
// resume 3d rendering
mSceneMgr->clearSpecialCaseRenderQueues();
mSceneMgr->setSpecialCaseRenderQueueMode(Ogre::SceneManager::SCRQM_EXCLUDE);
}
}
void LoadingScreen::loadingOn()
{
setVisible(true);
mLoadingOn = true;
}
void LoadingScreen::loadingOff()
{
setVisible(false);
mLoadingOn = false;
}
}