|
|
现在开始看看如何在OGRE下创建一个应用程序。稍微浏览一下工程目录就可以发现OGRE用来示例DEMO所用的ExampleApplication是我们绝佳的起点,let's go~
首先浏览ExampleApplication的公共接口,就一个,
virtual void go(void)
{
// 创建Root对象并初始化系统
if (!setup())
return;
/* Root对象的startRendering函数里面启动了标准WIN32窗口应用程序的消息循环...
** while( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
** {
** TranslateMessage( &msg );
** DispatchMessage( &msg );
** }
*/
mRoot->startRendering();
}
再来看看setup里面做了什么事情,
virtual bool setup(void)
{
// Root必须是OGRE里面创建的第一个对象
mRoot = new Root();
/* 从resources.cfg配置文件读取资源管理系统的资源查找路径,
** 如果要使用自己的资源,可以拷贝到OGRE设定的默认目录里或
** 者将自定义的目录添加到配置文件里面去。
*/
setupResources();
/* OGRE自带的系统配置窗口,枚举可用配置,从配置文件中读取
** 上一次的配置作为默认项,保存用户的更改。配置读取之后才
** 会调用Root对象的initialise函数进行初始化。
*/
bool carryOn = configure();
if (!carryOn) return false;
/* 选择一个场景管理器,默认使用ST_GENERIC,表示不指定类型,
** 可用的参数参考枚举类型SceneType, 有室内(ST_INTERIOR)、
** 室外(ST_EXTERIOR_XX)等。我们可以手动改变这个参数来选择
** 最合适的方式。
*/
chooseSceneManager();
/* 创建一个摄像机,默认放到了Z轴500的位置指向-Z轴的方向,
** 近裁减平面为5个世界坐标长度距离,后面看Demo的时候要
** 记住,否则位置对不上。
*/
createCamera();
/* 创建视口,默认为映射到整个窗口大小。
*/
createViewports();
/* 默认mipmap level,参考LOD,简单的说就是离视点越远的模型
** 纹理分辨率就越低,我们只需要提供一个精度的材质,其他精度
** 可以让系统代为生成,这里声明需要生成多少个等级。
*/
TextureManager::getSingleton().setDefaultNumMipMaps(5);
/* 纯抽象的方法,其他DEMO必须实现这个接口,以后要做的大部分
** 事情都在这里完成啦,如读取模型,设置场景等等。
*/
createScene();
/* 默认帧监听器,以后可以重载这个方法来注册我们自己的监听对象,
** 对角色/模型的控制代码就放在自定义的FrameListener里面。
*/
createFrameListener();
return true;
}
以上就是一个OGER应用程序的创建过程。对比一下在WIN32平台下创建一个典型的窗口应用程序,消息循环已经在Root对象的startRendering里面找到了,注册窗口类和创建窗口的代码又在哪里呢?搜索一下,哈,在RenderSystem的实现例如RenderSystem_Direct3D9里, 熟悉的代码在这里躺着呢,
/* OgreD3D9RenderWindow.cpp
*/
// 声明一个winclass
WNDCLASS wndClass = { ... };
// 注册窗口类
RegisterClass( &wndClass );
// 创建窗口
HWND hWnd = CreateWindow( ... );
// 显示窗口
ShowWindow(hWnd, SW_SHOWNORMAL);
UpdateWindow(hWnd);
// 消息循环
MSG msg;
while( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
...
真相大白了,读取配置后会调用Root对象的initialise函数,接着调用到当前RenderSystem的initialise,以上的Direct3D9 RenderSystem实现就会创建一个D3D9RenderWindow!
如果继承一个ExampleApplication实现一个最简单的OGRE应用程序,会看到创建出来的窗口并不是空荡荡的而是已经有了诸如FPS等统计信息,OGRE的LOGO等,这些东西哪里来的? 嗯,只能是ExampleFrameListener了... (打字打得好辛苦 [em10]) |
|