//----------------------------------------------------------------------- SceneManager* SceneManagerEnumerator::createSceneManager( const String& typeName, const String& instanceName) { if (mInstances.find(instanceName) != mInstances.end()) { OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, "SceneManager instance called '" + instanceName + "' already exists", "SceneManagerEnumerator::createSceneManager"); } SceneManager* inst = 0; for(Factories::iterator i = mFactories.begin(); i != mFactories.end(); ++i) { if ((*i)->getMetaData().typeName == typeName) { if (instanceName.empty()) { // generate a name StringUtil::StrStreamType s; s << "SceneManagerInstance" << ++mInstanceCreateCount; inst = (*i)->createInstance(s.str()); } else { inst = (*i)->createInstance(instanceName); } break; } } if (!inst) { // Error! OGRE_EXCEPT(Exception::ERR_ITEM_NOT_FOUND, "No factory found for scene manager of type '" + typeName + "'", "SceneManagerEnumerator::createSceneManager"); } /// assign rs if already configured if (mCurrentRenderSystem) inst->_setDestinationRenderSystem(mCurrentRenderSystem); mInstances[inst->getName()] = inst; return inst; }
//----------------------------------------------------------------------- SceneManager* SceneManagerEnumerator::createSceneManager( SceneTypeMask typeMask, const String& instanceName) { if (mInstances.find(instanceName) != mInstances.end()) { OGRE_EXCEPT(Exception::ERR_DUPLICATE_ITEM, "SceneManager instance called '" + instanceName + "' already exists", "SceneManagerEnumerator::createSceneManager"); } SceneManager* inst = 0; String name = instanceName; if (name.empty()) { // generate a name StringUtil::StrStreamType s; s << "SceneManagerInstance" << ++mInstanceCreateCount; name = s.str(); } // Iterate backwards to find the matching factory registered last for(Factories::reverse_iterator i = mFactories.rbegin(); i != mFactories.rend(); ++i) { if ((*i)->getMetaData().sceneTypeMask & typeMask) { inst = (*i)->createInstance(name); break; } } // use default factory if none if (!inst) inst = mDefaultFactory.createInstance(name); /// assign rs if already configured if (mCurrentRenderSystem) inst->_setDestinationRenderSystem(mCurrentRenderSystem); mInstances[inst->getName()] = inst; return inst; }