LoadingBar Class Example

grizzley90

22-12-2006 02:57:35

Here is a loading bar class for you all to enjoy. I translated it off the ogre example loading bar.

All you got to do is create an instance and call LoadingBarStart and LoadingBarFinish when you're done.


using System;
using Mogre;

/// <summary>
/// Loading Bar class
/// </summary>
public class LoadingBar
{
Mogre.RenderWindow mWindow = null;
public LoadingBar(Mogre.RenderWindow win)
{
mWindow = win;
}

private uint mNumGroupsInit = 1;
private uint mNumGroupsLoad = 1;
private float mInitProportion = 0.70f;

private float mProgressBarMaxSize;
private float mProgressBarInc;

public void LoadingBarStart()
{
Mogre.OverlayManager.Singleton.GetByName("Core/LoadOverlay").Show();

Mogre.OverlayManager.Singleton.GetOverlayElement("Core/LoadPanel/Bar/Progress").Width = 0;
mProgressBarMaxSize = Mogre.OverlayManager.Singleton.GetOverlayElement("Core/LoadPanel/Bar").Width;

Mogre.ResourceGroupManager.Singleton.ResourceGroupScriptingStarted += new Mogre.ResourceGroupListener.ResourceGroupScriptingStartedHandler(LoadingBarResourceGroupScriptingStarted);
Mogre.ResourceGroupManager.Singleton.ScriptParseStarted += new Mogre.ResourceGroupListener.ScriptParseStartedHandler(LoadingBarScriptParseStarted);
Mogre.ResourceGroupManager.Singleton.ScriptParseEnded += new Mogre.ResourceGroupListener.ScriptParseEndedHandler(LoadingBarScriptParseEnded);
Mogre.ResourceGroupManager.Singleton.ResourceGroupLoadStarted += new Mogre.ResourceGroupListener.ResourceGroupLoadStartedHandler(LoadingBarResourceGroupLoadStarted);
Mogre.ResourceGroupManager.Singleton.ResourceLoadStarted += new Mogre.ResourceGroupListener.ResourceLoadStartedHandler(LoadingBarResourceLoadStarted);
Mogre.ResourceGroupManager.Singleton.WorldGeometryStageStarted += new Mogre.ResourceGroupListener.WorldGeometryStageStartedHandler(LoadingBarWorldGeometryStageStarted);
Mogre.ResourceGroupManager.Singleton.WorldGeometryStageEnded += new Mogre.ResourceGroupListener.WorldGeometryStageEndedHandler(LoadingBarWorldGeometryStageEnded);
}
public void LoadingBarFinish()
{
// hide loading screen
Mogre.OverlayManager.Singleton.GetByName("Core/LoadOverlay").Hide();
// Unregister listener
Mogre.ResourceGroupManager.Singleton.ResourceGroupScriptingStarted -= new Mogre.ResourceGroupListener.ResourceGroupScriptingStartedHandler(LoadingBarResourceGroupScriptingStarted);
Mogre.ResourceGroupManager.Singleton.ScriptParseStarted -= new Mogre.ResourceGroupListener.ScriptParseStartedHandler(LoadingBarScriptParseStarted);
Mogre.ResourceGroupManager.Singleton.ScriptParseEnded -= new Mogre.ResourceGroupListener.ScriptParseEndedHandler(LoadingBarScriptParseEnded);
Mogre.ResourceGroupManager.Singleton.ResourceGroupLoadStarted -= new Mogre.ResourceGroupListener.ResourceGroupLoadStartedHandler(LoadingBarResourceGroupLoadStarted);
Mogre.ResourceGroupManager.Singleton.ResourceLoadStarted -= new Mogre.ResourceGroupListener.ResourceLoadStartedHandler(LoadingBarResourceLoadStarted);
Mogre.ResourceGroupManager.Singleton.WorldGeometryStageStarted -= new Mogre.ResourceGroupListener.WorldGeometryStageStartedHandler(LoadingBarWorldGeometryStageStarted);
Mogre.ResourceGroupManager.Singleton.WorldGeometryStageEnded -= new Mogre.ResourceGroupListener.WorldGeometryStageEndedHandler(LoadingBarWorldGeometryStageEnded);
}
private void LoadingBarResourceGroupScriptingStarted(string groupName, uint scriptCount)
{
// Lets assume script loading is 70%
mProgressBarInc = mProgressBarMaxSize * mInitProportion / (float)scriptCount;
mProgressBarInc /= mNumGroupsInit;
Mogre.OverlayManager.Singleton.GetOverlayElement("Core/LoadPanel/Description").Caption = "Parsing scripts...";
mWindow.Update();
}
private void LoadingBarScriptParseStarted(string scriptName)
{
Mogre.OverlayManager.Singleton.GetOverlayElement("Core/LoadPanel/Comment").Caption = scriptName;
mWindow.Update();
}
private void LoadingBarScriptParseEnded()
{
Mogre.OverlayManager.Singleton.GetOverlayElement("Core/LoadPanel/Bar/Progress").Width = (
Mogre.OverlayManager.Singleton.GetOverlayElement("Core/LoadPanel/Bar/Progress").Width
+ mProgressBarInc);
mWindow.Update();
}
private void LoadingBarResourceGroupLoadStarted(string groupName, uint resourceCount)
{

mProgressBarInc = mProgressBarMaxSize * (1 - mInitProportion) /
(float)resourceCount;
mProgressBarInc /= mNumGroupsLoad;
Mogre.OverlayManager.Singleton.GetOverlayElement("Core/LoadPanel/Description").Caption = "Loading resources...";
mWindow.Update();
}
private void LoadingBarResourceLoadStarted(Mogre.ResourcePtr resource)
{
Mogre.OverlayManager.Singleton.GetOverlayElement("Core/LoadPanel/Comment").Caption = resource.Name;
mWindow.Update();
}
private void LoadingBarWorldGeometryStageStarted(string description)
{
Mogre.OverlayManager.Singleton.GetOverlayElement("Core/LoadPanel/Comment").Caption = description;
mWindow.Update();
}
private void LoadingBarWorldGeometryStageEnded()
{
Mogre.OverlayManager.Singleton.GetOverlayElement("Core/LoadPanel/Bar/Progress").Width = (
Mogre.OverlayManager.Singleton.GetOverlayElement("Core/LoadPanel/Bar/Progress").Width +
mProgressBarInc);
mWindow.Update();
}
}

grizzley90

22-12-2006 03:02:48

Its in the wiki now:
http://www.ogre3d.org/wiki/index.php/MO ... BarExample

Happy Holidays!

Eldritch

24-05-2007 19:13:19

I've got a big problem with this, it does not show anything.. here is how I use it (the actual class is untouched and identical to what you have written here):


myroot = new Root();

if (myroot != null)
{
LoadResourceConfig("resources.cfg");

if (myroot.ShowConfigDialog())
{
SetupRenderWindow();

CreateSceneManager();

ResourceGroupManager.Singleton.InitialiseResourceGroup("Bootstrap");

myloadingbar.LoadingBarStart();

ResourceGroupManager.Singleton.InitialiseAllResourceGroups();

myloadingbar.LoadingBarFinish();
}
}


This is a quick overview of how I use the loading bar. When I start the application, I do not see anything related to a loading bar :) Am I doing stuff wrong?

I also tried this, from the SDK's example of the loading bar:


m_refLoadingBar.LoadingBarStart();

m_refSceneManager.ClearSpecialCaseRenderQueues();
m_refSceneManager.AddSpecialCaseRenderQueue((byte)RenderQueueGroupID.RENDER_QUEUE_OVERLAY);
m_refSceneManager.SetSpecialCaseRenderQueueMode(SceneManager.SpecialCaseRenderQueueMode.SCRQM_INCLUDE);
ResourceGroupManager.Singleton.InitialiseAllResourceGroups();

m_refSceneManager.ClearSpecialCaseRenderQueues();
m_refSceneManager.SetSpecialCaseRenderQueueMode(SceneManager.SpecialCaseRenderQueueMode.SCRQM_EXCLUDE);

m_refLoadingBar.LoadingBarFinish();

grizzley90

24-05-2007 19:26:14

The loading bar isn't for resource initialization but resource loading... Try surrounding your LoadResourceConfig function with LoadingBarStart and LoadingBarFinish.

Make sure that you have loaded OgreCore previously before starting the loading bar or else ogre won't find the necessary materials. You can do something like this before:
Mogre.ResourceGroupManager.Singleton.AddResourceLocation("Media/Core.zip", "Zip", "Core");
Mogre.ResourceGroupManager.Singleton.InitialiseResourceGroup("Core");


It should work fine.

Eldritch

24-05-2007 20:23:24

Aha, thanks!