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;
};
没做什么额外的工作