bool WorldManagerServer::loadMap(const Ogre::String& mapName) { WorldManager::loadMap(mapName); //cleanup for (std::vector<dGeomID>::iterator igeom = mStaticGeometries.begin(); igeom != mStaticGeometries.end(); igeom++) { dGeomDestroy(*igeom); } //creating new game and loading new map Ogre::DataStreamPtr stream = Ogre::ResourceGroupManager::getSingleton().openResource(mapName); MyGUI::xml::xmlDocument xml; if (!xml.open(stream)) return false; MyGUI::xml::xmlNodePtr root_node = xml.getRoot(); if (root_node->getName() != "map") return false; MyGUI::xml::xmlNodeIterator inode = root_node->getNodeIterator(); while (inode.nextNode()) { if (inode->getName() == "geom") { Ogre::String type = inode->findAttribute("type"); std::vector<Ogre::String> params = Ogre::StringUtil::split(inode->findAttribute("size"), " "); dGeomID geom; if (type == "box") { geom = dCreateBox(mStaticSpace, Ogre::StringConverter::parseReal(params[0]), Ogre::StringConverter::parseReal(params[1]), Ogre::StringConverter::parseReal(params[2]) ); } else if (type == "sphere") { geom = dCreateSphere(mStaticSpace, Ogre::StringConverter::parseReal(params[0]) ); } else if (type == "cylinder") { geom = dCreateCylinder(mStaticSpace, Ogre::StringConverter::parseReal(params[0]), Ogre::StringConverter::parseReal(params[1]) ); } else if (type == "capsule") { geom = dCreateCapsule(mStaticSpace, Ogre::StringConverter::parseReal(params[0]), Ogre::StringConverter::parseReal(params[1]) ); } else if (type == "plane") { geom = dCreatePlane(mStaticSpace, Ogre::StringConverter::parseReal(params[0]), Ogre::StringConverter::parseReal(params[1]), Ogre::StringConverter::parseReal(params[2]), Ogre::StringConverter::parseReal(params[3]) ); } else { return false; } mStaticGeometries.push_back(geom); } else { return false; } } return true; }
void EditorWidgets::parseWidget(MyGUI::xml::xmlNodeIterator & _widget, MyGUI::WidgetPtr _parent) { WidgetContainer * container = new WidgetContainer(); // парсим атрибуты виджета MyGUI::IntCoord coord; MyGUI::Align align = MyGUI::ALIGN_DEFAULT; _widget->findAttribute("name", container->name); _widget->findAttribute("type", container->type); _widget->findAttribute("skin", container->skin); _widget->findAttribute("layer", container->layer); if (_widget->findAttribute("align", container->align)) align = MyGUI::SkinManager::getInstance().parseAlign(container->align); if (_widget->findAttribute("position", container->position)) coord = MyGUI::IntCoord::parse(container->position); if (_widget->findAttribute("position_real", container->position_real)) coord = MyGUI::Gui::getInstance().convertRelativeToInt(MyGUI::FloatCoord::parse(container->position_real), _parent); // в гуе на 2 одноименных виджета ругается и падает, а у нас будет просто переименовывать if (false == container->name.empty()) { WidgetContainer * iter = find(container->name); if (null != iter) { LOGGING(LogSection, Warning, "widget with same name name '" << container->name << "'. Renamed"); static long renameN=0; container->name = MyGUI::utility::toString(container->name, renameN++); } } std::string tmpname = container->name; if (tmpname.empty()) { tmpname = MyGUI::utility::toString(container->type, global_counter); global_counter++; } //может и не стоит tmpname = "LayoutEditor_" + tmpname; if (null == _parent) { container->widget = MyGUI::Gui::getInstance().createWidgetT(container->type, container->skin, coord, align, container->layer, tmpname); add(container); } else { container->widget = _parent->createWidgetT(container->type, container->skin, coord, align, tmpname); add(container); } // берем детей и крутимся MyGUI::xml::xmlNodeIterator widget = _widget->getNodeIterator(); while (widget.nextNode()) { std::string key, value; if (widget->getName() == "Widget") parseWidget(widget, container->widget); else if (widget->getName() == "Property") { // парсим атрибуты if (false == widget->findAttribute("key", key)) continue; if (false == widget->findAttribute("value", value)) continue; // и парсим свойство if (("Message_Modal" != key) && ("Window_AutoAlpha" != key)) MyGUI::WidgetManager::getInstance().parse(container->widget, key, value); container->mProperty.push_back(std::make_pair(key, value)); } else if (widget->getName() == "UserString") { // парсим атрибуты if (false == widget->findAttribute("key", key)) continue; if (false == widget->findAttribute("value", value)) continue; container->mUserString.insert(std::make_pair(key, value)); } }; }
void EditorWidgets::parseWidget(MyGUI::xml::xmlNodeIterator & _widget, MyGUI::WidgetPtr _parent) { WidgetContainer * container = new WidgetContainer(); // парсим атрибуты виджета MyGUI::IntCoord coord; MyGUI::Align align = MyGUI::ALIGN_DEFAULT; _widget->findAttribute("name", container->name); _widget->findAttribute("type", container->type); _widget->findAttribute("skin", container->skin); _widget->findAttribute("layer", container->layer); if (_widget->findAttribute("align", container->align)) align = MyGUI::SkinManager::getInstance().parseAlign(container->align); if (_widget->findAttribute("position", container->position)) coord = MyGUI::IntCoord::parse(container->position); if (_widget->findAttribute("position_real", container->position_real)) coord = MyGUI::Gui::getInstance().convertRelativeToInt(MyGUI::FloatCoord::parse(container->position_real), _parent); // в гуе на 2 одноименных виджета ругается и падает, а у нас будет просто переименовывать if (false == container->name.empty()) { WidgetContainer * iter = find(container->name); if (null != iter) { static long renameN=0; std::string mess = MyGUI::utility::toString("widget with same name name '", container->name, "'. Renamed to '", container->name, renameN, "'."); LOGGING(LogSection, Warning, mess); MyGUI::Message::_createMessage("Warning", mess, "", "LayoutEditor_Popup", true, null, MyGUI::Message::IconWarning | MyGUI::Message::Ok); container->name = MyGUI::utility::toString(container->name, renameN++); } } std::string tmpname = container->name; if (tmpname.empty()) { tmpname = MyGUI::utility::toString(container->type, global_counter); global_counter++; } //может и не стоит tmpname = "LayoutEditor_" + tmpname; if (null == _parent) { container->widget = MyGUI::Gui::getInstance().createWidgetT(container->type, container->skin, coord, align, container->layer, tmpname); add(container); } else { container->widget = _parent->createWidgetT(container->type, container->skin, coord, align, tmpname); add(container); } // берем детей и крутимся MyGUI::xml::xmlNodeIterator widget = _widget->getNodeIterator(); while (widget.nextNode()) { std::string key, value; if (widget->getName() == "Widget") parseWidget(widget, container->widget); else if (widget->getName() == "Property") { // парсим атрибуты if (false == widget->findAttribute("key", key)) continue; if (false == widget->findAttribute("value", value)) continue; // и парсим свойство try{ if (("Message_Modal" != key) && ("Window_AutoAlpha" != key) && ("Window_Snap" != key)) MyGUI::WidgetManager::getInstance().parse(container->widget, key, value); Ogre::Root::getSingleton().renderOneFrame(); } catch(...) { MyGUI::Message::_createMessage("Warning", "No such " + key + ": '" + value + "'", "", "LayoutEditor_Popup", true, null, MyGUI::Message::IconWarning | MyGUI::Message::Ok); if (key == "Image_Texture") MyGUI::WidgetManager::getInstance().parse(container->widget, key, ""); }// for incorrect meshes or textures container->mProperty.push_back(std::make_pair(key, value)); } else if (widget->getName() == "UserString") { // парсим атрибуты if (false == widget->findAttribute("key", key)) continue; if (false == widget->findAttribute("value", value)) continue; container->mUserString.insert(std::make_pair(key, value)); } }; }