Ogre::SceneManager 详细之创建
2010-06-24 09:59
330 查看
struct SceneManagerMetaData { /// A globally unique string identifying the scene manager type String typeName; /// A text description of the scene manager String description; /// A mask describing which sorts of scenes this manager can handle SceneTypeMask sceneTypeMask; /// Flag indicating whether world geometry is supported bool worldGeometrySupported; }; Ogre 定义了这么一个结构体来包含SceneManager的信息,在SceneManagerEnumerator*里面会包含这个结构体
然后我们再plugin.cfg 里面定义的Scenemanager类型都会被他注册到SceneManagerEnumerator里面去,比如
void BspSceneManagerPlugin::initialise()
{
// Register (factory not dependent on rsys resources)
Root::getSingleton().addSceneManagerFactory(mBspFactory);
// Create resource manager (registers itself)
mBspResourceManager = OGRE_NEW BspResourceManager();
}
他会调用每一个Plugin的initialise在这里完成自我注册到root的过程
然后每一种SceneManager都会有一个XXSceneManagerFactory
我们以BSP为例(当然那OCTTREE也是一样的)
/** Class which will create instances of a given SceneManager. */
class _OgreExport SceneManagerFactory : public SceneMgtAlloc
{
protected:
virtual void initMetaData(void) const = 0;
public:
SceneManagerFactory() : mMetaDataInit(true) {}
virtual ~SceneManagerFactory() {}
/** Get information about the SceneManager type created by this factory. */
virtual const SceneManagerMetaData& getMetaData(void) const ;
/** Create a new instance of a SceneManager.
@remarks
Don't call directly, use SceneManagerEnumerator::createSceneManager.
*/
virtual SceneManager* createInstance(const String& instanceName) = 0;
/** Destroy an instance of a SceneManager. */
virtual void destroyInstance(SceneManager* instance) = 0;
};
SceneManagerFactory 是一个接口类,强制了每一种Scenemanager的创建都必须派生自他
比如
void BspSceneManagerFactory::initMetaData(void) const
{
mMetaData.typeName = FACTORY_TYPE_NAME;
mMetaData.description = "Scene manager for loading Quake3 .bsp files.";
mMetaData.sceneTypeMask = ST_INTERIOR;
mMetaData.worldGeometrySupported = true;
}
那么当我们再Root::CreateSceneManager的时候呢会调用
SceneManager* SceneManagerEnumerator::createSceneManager(
SceneTypeMask typeMask, const String& instanceName)
这个时候,ogre会遍历注册的工厂类的类型和我们要创建的是不是一样的
for(Factories::reverse_iterator i = mFactories.rbegin(); i != mFactories.rend(); ++i)
{
if ((*i)->getMetaData().sceneTypeMask & typeMask)
{
inst = (*i)->createInstance(name);
break;
}
}
最后将当前的Renderer注册给这个SceneManager
比如我们经常看到ST_GENERIC 这个是什么类型的SceneManager呢.. 其实就是Ogre::SceneManager
因为
class _OgreExport DefaultSceneManager : public SceneManager
{
public:
DefaultSceneManager(const String& name);
~DefaultSceneManager();
const String& getTypeName(void) const;
};
没做什么额外的工作
相关文章推荐
- MFC窗口的创建过程详细解析
- ogre创建平面、有关ogre里MeshManager::createPlane()函数的一点补充
- oracle 创建表空间详细介绍
- 创建Oracle本地数据库详细步骤
- 数据库、数据表的创建详细
- 使用create database语句创建数据库的详细操作步骤
- oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)
- Swift UIButton 和 UILabel 的详细解释和创建使用
- eclipse集成maven3后,创建java项目详细图解
- 用Maven创建Mahout环境详细过程
- 使用 IntelliJ IDEA 2016和Maven创建Java Web项目的详细步骤及相关问题解决办法
- Ogre 创建角色对象的边缘线效果
- 【Android游戏开发之十】(优化处理)详细剖析Android Traceview 效率检视工具!分析程序运行速度!并讲解两种创建SDcard方式!
- 28.6.1 如何获得数据库创建过程中的详细信息
- 采用zf.bat方式安装ZendFramework及创建项目详细步骤
- 使用T-SQL语句创建库,表,帐户,用户,授权的详细操作
- oracle 创建tablespace详细说明
- oracle创建user详细说明
- Lucene创建和查询索引库的HelloWorld(含详细注释)
- 如何创建一个用弹出窗口来查看详细信息的超链接列