您的位置:首页 > 其它

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;

};

没做什么额外的工作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: