void Entresol::ConstructFromXML(const String& EngineDataPath, const Mezzanine::ArchiveType ArchType, const String& InitializerFile) { //Add default manager factories AddAllEngineDefaultManagerFactories(); //Set some sane Defaults for some values. this->ManualLoopBreak = false; // Create Ogre. SetupOgre(); // Load the necessary plugins. SubSystemParticleFXPlugin = new Ogre::ParticleFXPlugin(); Ogre::Root::getSingleton().installPlugin(SubSystemParticleFXPlugin); // Set up the data we'll be populating. XML::Attribute CurrAttrib; String GUIInit, ResourceInit, PluginsInit, LogFileName; String PluginExtension, PluginPath; // Create or set the resource manager. /// @todo This currently forces our default resource manager to be constructed, which isn't in line with our factory/initiailzation design. /// This should be addressed somehow. if(ResourceManager::SingletonValid()) { AddManager(ResourceManager::GetSingletonPtr()); } else { AddManager(new ResourceManager(EngineDataPath, ArchType)); } // Open and load the initializer doc. ResourceManager* ResourceMan = GetResourceManager(); /// @todo Replace this stack allocated stream for one initialized from the Resource Manager, after the system is ready. Resource::FileStream InitStream(InitializerFile,EngineDataPath); XML::Document InitDoc; XML::ParseResult DocResult = InitDoc.Load(InitStream); if( DocResult.Status != XML::StatusOk ) { StringStream ExceptionStream; ExceptionStream << "Failed to parse XML file \"" << InitializerFile << "\"."; MEZZ_EXCEPTION(Exception::SYNTAX_ERROR_EXCEPTION_XML,ExceptionStream.str()); } XML::Node InitRoot = InitDoc.GetChild("InitializerRoot"); if( InitRoot.Empty() ) { StringStream ExceptionStream; ExceptionStream << "Failed to find expected Root node in \"" << InitializerFile << "\"."; MEZZ_EXCEPTION(Exception::SYNTAX_ERROR_EXCEPTION_XML,ExceptionStream.str()); } // Get the world settings and set them. XML::Node WorldSettings = InitRoot.GetChild("WorldSettings"); for( XML::NodeIterator SetIt = WorldSettings.begin() ; SetIt != WorldSettings.end() ; ++SetIt ) { String SecName = (*SetIt).Name(); if( "FrameSettings" == SecName ) { CurrAttrib = (*SetIt).GetAttribute("TargetFrameRate"); if(CurrAttrib.Empty()) { CurrAttrib = (*SetIt).GetAttribute("TargetFrameTime"); if(!CurrAttrib.Empty()) SetTargetFrameTimeMicroseconds(CurrAttrib.AsWhole()); }else{ this->SetTargetFrameRate(CurrAttrib.AsWhole()); } } else { MEZZ_EXCEPTION(Exception::SYNTAX_ERROR_EXCEPTION_XML,String("Unknown WorldSetting ")+SecName); } } SetupLogging(LogFileName); // Get the other initializer files we'll be using, since we'll need the plugins initializer. XML::Node InitFiles = InitRoot.GetChild("OtherInitializers"); for( XML::NodeIterator InitIt = InitFiles.begin() ; InitIt != InitFiles.end() ; ++InitIt ) { String InitFileName = (*InitIt).Name(); if( "PluginInit" == InitFileName ) { CurrAttrib = (*InitIt).GetAttribute("FileName"); if(!CurrAttrib.Empty()) PluginsInit = CurrAttrib.AsString(); } else if( "ResourceInit" == InitFileName ) { CurrAttrib = (*InitIt).GetAttribute("FileName"); if(!CurrAttrib.Empty()) ResourceInit = CurrAttrib.AsString(); } else if( "GUIInit" == InitFileName ) { CurrAttrib = (*InitIt).GetAttribute("FileName"); if(!CurrAttrib.Empty()) GUIInit = CurrAttrib.AsString(); } } // Load additional resource groups /*if(!ResourceInit.empty()) { /// @todo Replace this stack allocated stream for one initialized from the Resource Manager, after the system is ready. Resource::FileStream ResourceStream(ResourceInit,EngineDataPath); XML::Document ResourceDoc; ResourceDoc.Load(ResourceStream); // Get an iterator to the first resource group node, and declare them all. XML::Node ResourceLocations = ResourceDoc.GetChild("ResourceLocations"); for( XML::NodeIterator GroupIt = ResourceLocations.begin() ; GroupIt != ResourceLocations.end() ; ++GroupIt ) { String GroupName, GroupType, GroupPath; bool GroupRecursive = false; // Get the group path CurrAttrib = (*GroupIt).GetAttribute("GroupPath"); if(!CurrAttrib.Empty()) GroupPath = CurrAttrib.AsString(); // Get the group type CurrAttrib = (*GroupIt).GetAttribute("GroupType"); if(!CurrAttrib.Empty()) GroupType = CurrAttrib.AsString(); // Get the group name CurrAttrib = (*GroupIt).GetAttribute("GroupName"); if(!CurrAttrib.Empty()) GroupName = CurrAttrib.AsString(); // Get whether this is recursive CurrAttrib = (*GroupIt).GetAttribute("Recursive"); if(!CurrAttrib.Empty()) GroupRecursive = StringTool::ConvertToBool(CurrAttrib.AsString()); // Finally create the resource location. ResourceMan->AddAssetLocation(GroupPath,GroupType,GroupName,GroupRecursive); } // Get what resource groups should be initialized. XML::Node InitGroups = ResourceDoc.GetChild("InitGroups"); for( XML::NodeIterator InitIt = InitGroups.begin() ; InitIt != InitGroups.end() ; ++InitIt ) { String GroupName; CurrAttrib = (*InitIt).GetAttribute("GroupName"); if(!CurrAttrib.Empty()) GroupName = CurrAttrib.AsString(); ResourceMan->InitAssetGroup(GroupName); } }//*/ // Create the requested managers and set their necessary values. XML::Node Managers = InitRoot.GetChild("Managers"); for( XML::NodeIterator ManIt = Managers.begin() ; ManIt != Managers.end() ; ++ManIt ) { CreateManager( (*ManIt).Name(), (*ManIt) ); } // Load additional resource groups if(!ResourceInit.empty()) { /// @todo Replace this stack allocated stream for one initialized from the Resource Manager, after the system is ready. Resource::FileStream ResourceStream(ResourceInit,EngineDataPath); XML::Document ResourceDoc; ResourceDoc.Load(ResourceStream); // Get an iterator to the first resource group node, and declare them all. XML::Node ResourceLocations = ResourceDoc.GetChild("ResourceLocations"); for( XML::NodeIterator GroupIt = ResourceLocations.begin() ; GroupIt != ResourceLocations.end() ; ++GroupIt ) { String GroupName, GroupPath; ArchiveType GroupType; bool GroupRecursive = false; // Get the group path CurrAttrib = (*GroupIt).GetAttribute("GroupPath"); if(!CurrAttrib.Empty()) GroupPath = CurrAttrib.AsString(); // Get the group type CurrAttrib = (*GroupIt).GetAttribute("GroupType"); if(!CurrAttrib.Empty()) GroupType = ResourceManager::GetArchiveTypeFromString(CurrAttrib.AsString()); // Get the group name CurrAttrib = (*GroupIt).GetAttribute("GroupName"); if(!CurrAttrib.Empty()) GroupName = CurrAttrib.AsString(); // Get whether this is recursive CurrAttrib = (*GroupIt).GetAttribute("Recursive"); if(!CurrAttrib.Empty()) GroupRecursive = StringTools::ConvertToBool(CurrAttrib.AsString()); // Finally create the resource location. ResourceMan->AddAssetLocation(GroupPath,GroupType,GroupName,GroupRecursive); } // Get what resource groups should be initialized. XML::Node InitGroups = ResourceDoc.GetChild("InitGroups"); for( XML::NodeIterator InitIt = InitGroups.begin() ; InitIt != InitGroups.end() ; ++InitIt ) { String GroupName; CurrAttrib = (*InitIt).GetAttribute("GroupName"); if(!CurrAttrib.Empty()) GroupName = CurrAttrib.AsString(); ResourceMan->InitAssetGroup(GroupName); } } // Configure the UI if(!GUIInit.empty()) { /// @todo This is currently not implemented. } SanityChecks(); }
void MultiImageLayer::ProtoDeSerializeProperties(const XML::Node& SelfRoot) { this->ImageLayer::ProtoDeSerializeProperties(SelfRoot); XML::Attribute CurrAttrib; XML::Node PropertiesNode = SelfRoot.GetChild( MultiImageLayer::GetSerializableName() + "Properties" ); if( !PropertiesNode.Empty() ) { if(PropertiesNode.GetAttribute("Version").AsInt() == 1) { XML::Node LayerImagesNode = PropertiesNode.GetChild( MultiImageLayer::GetSerializableName() + "Properties" ); CurrAttrib = LayerImagesNode.GetAttribute("NumImages"); if( !CurrAttrib.Empty() ) this->ReserveMultiImageData( CurrAttrib.AsWhole() ); /// @todo This loop expects the listed order in the XML to match the order in which they were serialized. Within PugiXML at least this /// shouldn't be a problem, however if Images start appearing out of order it may be worthwhile to investigate or add some ordering redundancy. ImageDataIterator ImageIt = this->LayerImages.begin(); for( XML::NodeIterator ImageNodeIt = LayerImagesNode.begin() ; ImageNodeIt != LayerImagesNode.end() ; ++ImageNodeIt ) { String SpriteName, SpriteAtlas; if( ImageIt == this->LayerImages.end() ) { MEZZ_EXCEPTION(ExceptionBase::PARAMETERS_RANGE_EXCEPTION,"Seriailzed value for \"NumImages\" is smaller than number of nodes to deserialize. Verify serialized XML."); } CurrAttrib = (*ImageNodeIt).GetAttribute("SpriteName"); if( !CurrAttrib.Empty() ) SpriteName = CurrAttrib.AsString(); CurrAttrib = (*ImageNodeIt).GetAttribute("SpriteAtlas"); if( !CurrAttrib.Empty() ) SpriteAtlas = CurrAttrib.AsString(); (*ImageIt).LayerSprite = this->Parent->GetScreen()->GetSprite(SpriteName,SpriteAtlas); XML::Node FillRectNode = (*ImageNodeIt).GetChild("FillRect").GetFirstChild(); if( !FillRectNode.Empty() ) (*ImageIt).FillRect.ProtoDeSerialize(FillRectNode); XML::Node FillColoursNode = (*ImageNodeIt).GetChild("FillColours"); XML::Node TopLeftFillNode = FillColoursNode.GetChild("TopLeft").GetFirstChild(); if( !TopLeftFillNode.Empty() ) (*ImageIt).FillColours[UI::QC_TopLeft].ProtoDeSerialize(TopLeftFillNode); XML::Node TopRightFillNode = FillColoursNode.GetChild("TopRight").GetFirstChild(); if( !TopRightFillNode.Empty() ) (*ImageIt).FillColours[UI::QC_TopRight].ProtoDeSerialize(TopRightFillNode); XML::Node BottomLeftFillNode = FillColoursNode.GetChild("BottomLeft").GetFirstChild(); if( !BottomLeftFillNode.Empty() ) (*ImageIt).FillColours[UI::QC_BottomLeft].ProtoDeSerialize(BottomLeftFillNode); XML::Node BottomRightFillNode = FillColoursNode.GetChild("BottomRight").GetFirstChild(); if( !BottomRightFillNode.Empty() ) (*ImageIt).FillColours[UI::QC_BottomRight].ProtoDeSerialize(BottomRightFillNode); ++ImageIt; } }else{ MEZZ_EXCEPTION(ExceptionBase::INVALID_VERSION_EXCEPTION,"Incompatible XML Version for " + (String("MultiImageData") + "Properties") + ": Not Version 1."); } }else{ MEZZ_EXCEPTION(ExceptionBase::II_IDENTITY_NOT_FOUND_EXCEPTION,String("MultiImageData") + "Properties" + " was not found in the provided XML node, which was expected."); } }
void GravityWell::ProtoDeSerializeProperties(const XML::Node& SelfRoot) { this->AreaEffect::ProtoDeSerializeProperties(SelfRoot); XML::Attribute CurrAttrib; XML::Node PropertiesNode = SelfRoot.GetChild( GravityWell::GetSerializableName() + "Properties" ); if( !PropertiesNode.Empty() ) { if(PropertiesNode.GetAttribute("Version").AsInt() == 1) { CurrAttrib = PropertiesNode.GetAttribute("AttenAmount"); if( !CurrAttrib.Empty() ) this->SetAttenuationAmount( CurrAttrib.AsReal() ); CurrAttrib = PropertiesNode.GetAttribute("AttenStyle"); if( !CurrAttrib.Empty() ) this->SetAttenuationStyle( static_cast<Mezzanine::AttenuationStyle>( CurrAttrib.AsWhole() ) ); CurrAttrib = PropertiesNode.GetAttribute("Strength"); if( !CurrAttrib.Empty() ) this->SetFieldStrength( CurrAttrib.AsReal() ); CurrAttrib = PropertiesNode.GetAttribute("AllowWorldGravity"); if( !CurrAttrib.Empty() ) this->SetAllowWorldGravity( StringTools::ConvertToBool( CurrAttrib.AsString() ) ); }else{ MEZZ_EXCEPTION(ExceptionBase::INVALID_VERSION_EXCEPTION,"Incompatible XML Version for " + (GravityWell::GetSerializableName() + "Properties" ) + ": Not Version 1."); } }else{ MEZZ_EXCEPTION(ExceptionBase::II_IDENTITY_NOT_FOUND_EXCEPTION,GravityWell::GetSerializableName() + "Properties" + " was not found in the provided XML node, which was expected."); } }