Ogre::SceneManager 详细之创建

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;
};

没做什么额外的工作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值