Mogre学习笔记(四)

Section 4: The Ogre startup sequence

在我们写自己的Ogre应用前,必须知道Ogre有一个特殊的启动顺序。他主要分为以下7步:

  1. 生成一个Root对象
  2. 定义资源:ResourceGroupManager.Singleton.AddResourceLocation(location, type, group)
  3. 设置RenderSystem
  4. 生成RenderWindow
  5. 初始化资源组(Resource Group)
  6. 建立场景
  7. Rander循环:这里用的是StartRendering

具体代码如下,F5运行即可:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using Mogre;
using System.Drawing;

namespace Tutorial05
{
static class Program
{
[STAThread]
static void Main()
{
OgreStartup ogre = new OgreStartup();
ogre.Go();
}
}

class OgreStartup
{
Root mRoot = null;
float ticks = 0;

public void Go()
{
CreateRoot();
DefineResources();
SetupRenderSystem();
CreateRenderWindow();
InitializeResourceGroups();
CreateScene();
StartRenderLoop();
}

void CreateRoot()
{
mRoot = new Root();
}

void DefineResources()
{
ConfigFile cf = new ConfigFile();
cf.Load("resources.cfg", "\t:=", true);
ConfigFile.SectionIterator seci = cf.GetSectionIterator();
String secName, typeName, archName;

while (seci.MoveNext())
{
secName = seci.CurrentKey;
ConfigFile.SettingsMultiMap settings = seci.Current;
foreach (KeyValuePair<string, string> pair in settings)
{
typeName = pair.Key;
archName = pair.Value;
ResourceGroupManager.Singleton.AddResourceLocation(archName, typeName, secName);
}
}

}

void SetupRenderSystem()
{
if (!mRoot.ShowConfigDialog())
throw new Exception("The user canceled the configuration dialog.");
}

void CreateRenderWindow()
{
mRoot.Initialise(true, "Main Ogre Window");
}

void InitializeResourceGroups()
{
TextureManager.Singleton.DefaultNumMipmaps = 5;
ResourceGroupManager.Singleton.InitialiseAllResourceGroups();
}

private void CreateScene()
{
SceneManager mgr = mRoot.CreateSceneManager(SceneType.ST_GENERIC);
Camera cam = mgr.CreateCamera("Camera");
mRoot.AutoCreatedWindow.AddViewport(cam);

Entity ent = mgr.CreateEntity("ninja", "ninja.mesh");
mgr.RootSceneNode.CreateChildSceneNode().AttachObject(ent);

cam.Position = new Vector3(0, 200, -400);
cam.LookAt(ent.BoundingBox.Center);

mRoot.FrameEnded += new FrameListener.FrameEndedHandler(FrameEnded);
ticks = Environment.TickCount;
}

bool FrameEnded(FrameEvent evt)
{
if (Environment.TickCount - ticks > 5000)
return false;

return true;
}

void StartRenderLoop()
{
mRoot.StartRendering();

}

}
}

你可能感兴趣的:(windows,Go)