void OgreNetworkReply::abort() { if (!mDataStream.isNull()) { mDataStream->close(); mDataStream.setNull(); } }
void UnloadMaterials(const std::string& filename) { if (filename.empty()) { Ogre::LogManager::getSingleton().logMessage("Filename is empty."); return; } Ogre::DataStreamPtr stream = Ogre::ResourceGroupManager::getSingleton().openResource(filename); if(!stream.isNull()) { try { while(!stream->eof()) { std::string line = stream->getLine(); StringUtil::trim(line); /// /// UNLOAD MATERIALS /// if (StringUtil::startsWith(line, "material")) { Ogre::vector<Ogre::String>::type vec = StringUtil::split(line," \t:"); bool skipFirst = true; for (Ogre::vector<Ogre::String>::type::iterator it = vec.begin(); it < vec.end(); ++it) { if (skipFirst) { skipFirst = false; continue; } std::string match = (*it); StringUtil::trim(match); if (!match.empty()) { UnloadResource(Ogre::MaterialManager::getSingletonPtr(), match); break; } } } } } catch (Ogre::Exception &e) { StringUtil::StrStreamType msg; msg << "Exception: FILE: " << __FILE__ << " LINE: " << __LINE__ << " DESC: " << e.getFullDescription() << std::endl; Ogre::LogManager::getSingleton().logMessage(msg.str()); } } stream->close(); }
/* Loads an XmlDocument from a filename. * Requires: * @filename The xml filename * Returns: * @doc The xmlDocument or 0 if error */ TiXmlDocument *Util::loadXmlDocument(const char *fname) { ASSERT(fname); TiXmlDocument *XMLDoc = 0; try { // Strip the path Ogre::String basename, path; Ogre::StringUtil::splitFilename(fname, basename, path); // we will hardcode the groupName Ogre::DataStreamPtr pStream = Ogre::ResourceGroupManager::getSingleton(). openResource( basename, Ogre::ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME); //DataStreamPtr pStream = ResourceGroupManager::getSingleton(). // openResource( SceneName, groupName ); Ogre::String data = pStream->getAsString(); // Open the .scene File XMLDoc = new TiXmlDocument(); XMLDoc->Parse( data.c_str() ); pStream->close(); pStream.setNull(); if( XMLDoc->Error() ) { //We'll just log, and continue on gracefully debug("Couldn't load the %s xml\n", fname); delete XMLDoc; return 0; } } catch(...) { //We'll just log, and continue on gracefully debug("Error creating TiXmlDocument for %s\n", fname); delete XMLDoc; return 0; } // Close the XML File return XMLDoc; }
//loader for ScriptSystem std::string OgreFileLoader(lua_State* pState, std::string strFile) { if(!Ogre::ResourceGroupManager::getSingleton().resourceExists(Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, strFile)) return std::string("file not found"); Ogre::DataStreamPtr ds = Ogre::ResourceGroupManager::getSingleton().openResource(strFile); char *buffer = ICE_NEW char[ds->size()]; ds->read(buffer, ds->size()); ds->close(); if(luaL_loadbuffer(pState, buffer, ds->size(), strFile.c_str()) || lua_pcall(pState, 0, 0, 0)) { ICE_DELETE buffer; return std::string(lua_tostring(pState, -1)); } ICE_DELETE buffer; return std::string(); }
void Level::parseLevelFile(const Ogre::String &FileName, const Ogre::String &groupName, Ogre::SceneManager *sceneMgr, Ogre::SceneNode *AttachNode, const Ogre::String &prependNode) { mGroupName = groupName; mSceneMgr = sceneMgr; mPrependNode = prependNode; TiXmlDocument *mXMLDoc = 0; TiXmlElement *mXMLRoot = 0; try { Ogre::String basename, path; Ogre::StringUtil::splitFilename(FileName, basename, path); Ogre::DataStreamPtr spStream = Ogre::ResourceGroupManager::getSingleton().openResource(basename,groupName); Ogre::String data = spStream->getAsString(); mXMLDoc = new TiXmlDocument(); mXMLDoc->Parse(data.c_str()); spStream->close(); spStream.setNull(); mXMLRoot = mXMLDoc->RootElement(); mAttachNode = AttachNode; if(!mAttachNode) mAttachNode = mSceneMgr->getRootSceneNode(); parseScene(mXMLRoot); delete mXMLDoc; } catch(Ogre::Exception e) { Ogre::LogManager::getSingleton().logMessage("Level failed to load"); delete mXMLDoc; } }
ResourceWrapper OgreResourceProvider::getResource(const std::string& name) { Ogre::DataStreamPtr input = Ogre::ResourceGroupManager::getSingleton().openResource(name, mGroupName); if (input.isNull()) { throw Exception("Unable to open resource file '" + name + "' in resource group '" + name + "'."); } OgreResourceWrapper* wrapper = new OgreResourceWrapper(input); input->close(); return ResourceWrapper(wrapper, name); // Ogre::String buf = input->getAsString(); // const size_t memBuffSize = buf.length(); // // unsigned char* mem = new unsigned char[memBuffSize]; // memcpy(mem, buf.c_str(), memBuffSize); // // output.setData(mem); // output.setSize(memBuffSize); }
bool openXMLDocument(const gkString& fileName, TiXmlDocument &XMLDoc, const gkString& resGroupName) { try { //open from file if (!Ogre::ResourceGroupManager::getSingletonPtr()) return openXMLDocumentOnFile(fileName, XMLDoc); //open from resource // Strip the path gkString basename, path; Ogre::StringUtil::splitFilename(fileName, basename, path); Ogre::DataStreamPtr pStream = Ogre::ResourceGroupManager::getSingleton(). openResource( basename, resGroupName ); gkString data = pStream->getAsString(); // Open the .scene File XMLDoc.Parse( data.c_str() ); pStream->close(); pStream.setNull(); if (XMLDoc.Error()) { gkPrintf("[XML] Error - The TiXmlDocument reported an error: %s", XMLDoc.ErrorDesc()); return false; } } catch(Ogre::Exception &e) { gkPrintf("[XML] Error - creating TiXmlDocument %s %s", fileName.c_str(), e.getDescription().c_str()); return false; } return true; }
//-------------------------------------------------------------------------- void FLevelFileSerializer::importFLevelFile( Ogre::DataStreamPtr &stream, FLevelFile* pDest ) { size_t start_position( stream->tell() ); readFileHeader( stream ); uint32 section_offsets[ m_header.section_count ]; readInts( stream, section_offsets, m_header.section_count ); Ogre::DataStreamPtr section; for( size_t i(0); i < m_header.section_count; ++i ) { size_t current_offset( stream->tell() - start_position ); size_t section_gap( section_offsets[i] - current_offset ); if( current_offset > section_offsets[i] ) { OGRE_EXCEPT(Ogre::Exception::ERR_INVALIDPARAMS ,"FLevel sections overlap" ,"FLevelFileSerializer::importFLevelFile" ); } else if( section_gap ) { stream->skip( section_gap ); Ogre::LogManager::getSingleton().stream() << "Warning: skiping gap in front of section " << i << " gap size " << section_gap << " FLevelFileSerializer::importFLevelFile"; } readSectionData( stream, section ); readSection( section, pDest, i ); section->close(); section.setNull(); } readEnd( stream ); }
void ReloadMaterial(const std::string& materialName, const std::string& groupName, const std::string& filename, bool parseMaterialScript) { if (materialName.empty()) { Ogre::LogManager::getSingleton().logMessage("Material name is empty."); return; } if (groupName.empty()) { Ogre::LogManager::getSingleton().logMessage("Group name is empty."); return; } if (filename.empty()) { Ogre::LogManager::getSingleton().logMessage("Filename is empty."); return; } UnloadMaterials(filename); UnloadVertexPrograms(filename); UnloadFragmentPrograms(filename); if (parseMaterialScript) { Ogre::DataStreamPtr stream = Ogre::ResourceGroupManager::getSingleton().openResource(filename); if(!stream.isNull()) { try { Ogre::MaterialManager::getSingleton().parseScript(stream, groupName); Ogre::MaterialPtr materialPtr = Ogre::MaterialManager::getSingleton().getByName(materialName); if (!materialPtr.isNull()) { materialPtr->compile(); materialPtr->load(); } } catch (Ogre::Exception &e) { StringUtil::StrStreamType msg; msg << "Exception: FILE: " << __FILE__ << " LINE: " << __LINE__ << " DESC: " << e.getFullDescription() << std::endl; Ogre::LogManager::getSingleton().logMessage(msg.str()); } } stream->close(); /// /// RELOAD MATERIAL SCRIPT CONTENTS /// stream = Ogre::ResourceGroupManager::getSingleton().openResource(filename); if(!stream.isNull()) { try { /// /// RELOAD ALL MATERIAL CONTENTS IN FILE /// while(!stream->eof()) { std::string line = stream->getLine(); StringUtil::trim(line); /// /// RELOAD MATERIALS /// if (StringUtil::startsWith(line, "material")) { Ogre::vector<Ogre::String>::type vec = StringUtil::split(line," \t:"); bool skipFirst = true; for (Ogre::vector<Ogre::String>::type::iterator it = vec.begin(); it < vec.end(); ++it) { if (skipFirst) { skipFirst = false; continue; } std::string match = (*it); StringUtil::trim(match); if (!match.empty()) { LoadResource(Ogre::MaterialManager::getSingletonPtr(), match, groupName); break; } } } /// /// RELOAD VERTEX PROGRAMS /// if (StringUtil::startsWith(line, "vertex_program") && !StringUtil::startsWith(line, "vertex_program_ref")) { Ogre::vector<Ogre::String>::type vec = StringUtil::split(line," \t"); bool skipFirst = true; for (Ogre::vector<Ogre::String>::type::iterator it = vec.begin(); it < vec.end(); ++it) { if (skipFirst) { skipFirst = false; continue; } std::string match = (*it); StringUtil::trim(match); if (!match.empty()) { LoadResource(Ogre::HighLevelGpuProgramManager::getSingletonPtr(), match, groupName); break; } } } /// /// RELOAD FRAGMENT PROGRAMS /// if (StringUtil::startsWith(line, "fragment_program") && !StringUtil::startsWith(line, "fragment_program_ref")) { Ogre::vector<Ogre::String>::type vec = StringUtil::split(line," \t"); bool skipFirst = true; for (Ogre::vector<Ogre::String>::type::iterator it = vec.begin(); it < vec.end(); ++it) { if (skipFirst) { skipFirst = false; continue; } std::string match = (*it); StringUtil::trim(match); if (!match.empty()) { LoadResource(Ogre::HighLevelGpuProgramManager::getSingletonPtr(), match, groupName); break; } } } } } catch (Ogre::Exception &e) { StringUtil::StrStreamType msg; msg << "Exception: FILE: " << __FILE__ << " LINE: " << __LINE__ << " DESC: " << e.getFullDescription() << std::endl; Ogre::LogManager::getSingleton().logMessage(msg.str()); } } stream->close(); try { // Do a render test if it fails, leave materials unloaded Ogre::Root::getSingleton().renderOneFrame(); return; } catch (Ogre::Exception &e) { UnloadVertexPrograms(filename); StringUtil::StrStreamType msg; msg << "Render test failed. Unloading vertex programs." << std::endl; msg << "Exception: FILE: " << __FILE__ << " LINE: " << __LINE__ << " DESC: " << e.getFullDescription() << std::endl; Ogre::LogManager::getSingleton().logMessage(msg.str()); } try { // Do a render test if it fails, leave materials unloaded Ogre::Root::getSingleton().renderOneFrame(); } catch (Ogre::Exception &e) { // Don't load the script this time ReloadMaterial(materialName, groupName, filename, false); StringUtil::StrStreamType msg; msg << "Render test failed. Unloading materials." << std::endl; msg << "Exception: FILE: " << __FILE__ << " LINE: " << __LINE__ << " DESC: " << e.getFullDescription() << std::endl; Ogre::LogManager::getSingleton().logMessage(msg.str()); } } }
void FontLoader::loadFont(const std::string &fileName, bool exportToFile) { Ogre::DataStreamPtr file = Ogre::ResourceGroupManager::getSingleton().openResource(fileName); float fontSize; int one; file->read(&fontSize, sizeof(fontSize)); file->read(&one, sizeof(int)); assert(one == 1); file->read(&one, sizeof(int)); assert(one == 1); char name_[284]; file->read(name_, sizeof(name_)); std::string name(name_); GlyphInfo data[256]; file->read(data, sizeof(data)); file->close(); // Create the font texture std::string bitmapFilename = "Fonts/" + std::string(name) + ".tex"; Ogre::DataStreamPtr bitmapFile = Ogre::ResourceGroupManager::getSingleton().openResource(bitmapFilename); int width, height; bitmapFile->read(&width, sizeof(int)); bitmapFile->read(&height, sizeof(int)); std::vector<Ogre::uchar> textureData; textureData.resize(width*height*4); bitmapFile->read(&textureData[0], width*height*4); bitmapFile->close(); std::string resourceName; if (name.size() >= 5 && Misc::StringUtils::ciEqual(name.substr(0, 5), "magic")) resourceName = "Magic Cards"; else if (name.size() >= 7 && Misc::StringUtils::ciEqual(name.substr(0, 7), "century")) resourceName = "Century Gothic"; else if (name.size() >= 7 && Misc::StringUtils::ciEqual(name.substr(0, 7), "daedric")) resourceName = "Daedric"; else return; // no point in loading it, since there is no way of using additional fonts std::string textureName = name; Ogre::Image image; image.loadDynamicImage(&textureData[0], width, height, Ogre::PF_BYTE_RGBA); Ogre::TexturePtr texture = Ogre::TextureManager::getSingleton().createManual(textureName, Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D, width, height, 0, Ogre::PF_BYTE_RGBA); texture->loadImage(image); if (exportToFile) image.save(resourceName + ".png"); // Register the font with MyGUI MyGUI::ResourceManualFont* font = static_cast<MyGUI::ResourceManualFont*>( MyGUI::FactoryManager::getInstance().createObject("Resource", "ResourceManualFont")); // We need to emulate loading from XML because the data members are private as of mygui 3.2.0 MyGUI::xml::Document xmlDocument; MyGUI::xml::ElementPtr root = xmlDocument.createRoot("ResourceManualFont"); root->addAttribute("name", resourceName); MyGUI::xml::ElementPtr defaultHeight = root->createChild("Property"); defaultHeight->addAttribute("key", "DefaultHeight"); defaultHeight->addAttribute("value", fontSize); MyGUI::xml::ElementPtr source = root->createChild("Property"); source->addAttribute("key", "Source"); source->addAttribute("value", std::string(textureName)); MyGUI::xml::ElementPtr codes = root->createChild("Codes"); for(int i = 0; i < 256; i++) { float x1 = data[i].top_left.x*width; float y1 = data[i].top_left.y*height; float w = data[i].top_right.x*width - x1; float h = data[i].bottom_left.y*height - y1; ToUTF8::Utf8Encoder encoder(mEncoding); unsigned long unicodeVal = utf8ToUnicode(getUtf8(i, encoder, mEncoding)); MyGUI::xml::ElementPtr code = codes->createChild("Code"); code->addAttribute("index", unicodeVal); code->addAttribute("coord", MyGUI::utility::toString(x1) + " " + MyGUI::utility::toString(y1) + " " + MyGUI::utility::toString(w) + " " + MyGUI::utility::toString(h)); code->addAttribute("advance", data[i].width); code->addAttribute("bearing", MyGUI::utility::toString(data[i].kerning) + " " + MyGUI::utility::toString((fontSize-data[i].ascent))); code->addAttribute("size", MyGUI::IntSize(data[i].width, data[i].height)); // More hacks! The french game uses several win1252 characters that are not included // in the cp437 encoding of the font. Fall back to similar available characters. if (mEncoding == ToUTF8::CP437) { std::multimap<int, int> additional; // <cp437, unicode> additional.insert(std::make_pair(39, 0x2019)); // apostrophe additional.insert(std::make_pair(45, 0x2013)); // dash additional.insert(std::make_pair(45, 0x2014)); // dash additional.insert(std::make_pair(34, 0x201D)); // right double quotation mark additional.insert(std::make_pair(34, 0x201C)); // left double quotation mark additional.insert(std::make_pair(44, 0x201A)); additional.insert(std::make_pair(44, 0x201E)); additional.insert(std::make_pair(43, 0x2020)); additional.insert(std::make_pair(94, 0x02C6)); additional.insert(std::make_pair(37, 0x2030)); additional.insert(std::make_pair(83, 0x0160)); additional.insert(std::make_pair(60, 0x2039)); additional.insert(std::make_pair(79, 0x0152)); additional.insert(std::make_pair(90, 0x017D)); additional.insert(std::make_pair(39, 0x2019)); additional.insert(std::make_pair(126, 0x02DC)); additional.insert(std::make_pair(84, 0x2122)); additional.insert(std::make_pair(83, 0x0161)); additional.insert(std::make_pair(62, 0x203A)); additional.insert(std::make_pair(111, 0x0153)); additional.insert(std::make_pair(122, 0x017E)); additional.insert(std::make_pair(89, 0x0178)); additional.insert(std::make_pair(156, 0x00A2)); additional.insert(std::make_pair(46, 0x2026)); for (std::multimap<int, int>::iterator it = additional.begin(); it != additional.end(); ++it) { if (it->first != i) continue; MyGUI::xml::ElementPtr code = codes->createChild("Code"); code->addAttribute("index", it->second); code->addAttribute("coord", MyGUI::utility::toString(x1) + " " + MyGUI::utility::toString(y1) + " " + MyGUI::utility::toString(w) + " " + MyGUI::utility::toString(h)); code->addAttribute("advance", data[i].width); code->addAttribute("bearing", MyGUI::utility::toString(data[i].kerning) + " " + MyGUI::utility::toString((fontSize-data[i].ascent))); code->addAttribute("size", MyGUI::IntSize(data[i].width, data[i].height)); } } // ASCII vertical bar, use this as text input cursor if (i == 124) { MyGUI::xml::ElementPtr cursorCode = codes->createChild("Code"); cursorCode->addAttribute("index", MyGUI::FontCodeType::Cursor); cursorCode->addAttribute("coord", MyGUI::utility::toString(x1) + " " + MyGUI::utility::toString(y1) + " " + MyGUI::utility::toString(w) + " " + MyGUI::utility::toString(h)); cursorCode->addAttribute("advance", data[i].width); cursorCode->addAttribute("bearing", MyGUI::utility::toString(data[i].kerning) + " " + MyGUI::utility::toString((fontSize-data[i].ascent))); cursorCode->addAttribute("size", MyGUI::IntSize(data[i].width, data[i].height)); } // Question mark, use for NotDefined marker (used for glyphs not existing in the font) if (i == 63) { MyGUI::xml::ElementPtr cursorCode = codes->createChild("Code"); cursorCode->addAttribute("index", MyGUI::FontCodeType::NotDefined); cursorCode->addAttribute("coord", MyGUI::utility::toString(x1) + " " + MyGUI::utility::toString(y1) + " " + MyGUI::utility::toString(w) + " " + MyGUI::utility::toString(h)); cursorCode->addAttribute("advance", data[i].width); cursorCode->addAttribute("bearing", MyGUI::utility::toString(data[i].kerning) + " " + MyGUI::utility::toString((fontSize-data[i].ascent))); cursorCode->addAttribute("size", MyGUI::IntSize(data[i].width, data[i].height)); } } // These are required as well, but the fonts don't provide them for (int i=0; i<2; ++i) { MyGUI::FontCodeType::Enum type; if(i == 0) type = MyGUI::FontCodeType::Selected; else if (i == 1) type = MyGUI::FontCodeType::SelectedBack; MyGUI::xml::ElementPtr cursorCode = codes->createChild("Code"); cursorCode->addAttribute("index", type); cursorCode->addAttribute("coord", "0 0 0 0"); cursorCode->addAttribute("advance", "0"); cursorCode->addAttribute("bearing", "0 0"); cursorCode->addAttribute("size", "0 0"); } if (exportToFile) { xmlDocument.createDeclaration(); xmlDocument.save(resourceName + ".xml"); } font->deserialization(root, MyGUI::Version(3,2,0)); MyGUI::ResourceManager::getInstance().removeByName(font->getResourceName()); MyGUI::ResourceManager::getInstance().addResource(font); }