如果说root是需要关注的第一个类,那么Scene必须是我们紧接着需要关注的模块,这个模块把各种资源有机的组合到一起。如果说root的主要作用是初始化,那么Scene就是对整个场景的组织和渲染,当然它不会涉及到具体的操作,但是它会调用一些具体的操作。
SceneManagerEnumerator:
Scene模块的入口,这个类的出现并不以外,因为场景的管理有好多种方案,以外的是它不直接创建SceneManager,SceneManager尽然还有SceneManagerFactory。话说ogre里面的Manager不是都是单例的么?SceneManagerEnumerator的职责与root类似,只不过它创建的是Scene模块的对象,这里只贴出它的字段来:
public:
/// Scene manager instances, indexed by instance name
typedef map<String, SceneManager*>::type Instances;
/// List of available scene manager types as meta data
typedef vector<const SceneManagerMetaData*>::type MetaDataList;
private:
/// Scene manager factories
typedef list<SceneManagerFactory*>::type Factories;
Factories mFactories;
Instances mInstances;
/// Stored separately to allow iteration
MetaDataList mMetaDataList;
/// Factory for default scene manager
DefaultSceneManagerFactory mDefaultFactory;
/// Count of creations for auto-naming
unsigned long mInstanceCreateCount;
/// Currently assigned render system
RenderSystem* mCurrentRenderSystem;
落到实处咱关心的也就三个东西,SceneManager,SceneManagerMetaData和 RenderSystem。
SceneManagerMetaData :MetaData其实是一种数据模型的概念,它的意义就是让数据模块化,这样用起来就不会到处乱放。这里是每一种SceneManager对应一个SceneManagerMetaData对象,这也是合理的。
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;
};
看到了吧,以typeName来寻找对应的 SceneManagerMetaData,所有的SceneManagerMetaData都在SceneManagerEnumerator里面存储。