//----------------------------------------------------------------------- FileInfoListPtr Utf8Archive::findFileInfo(const String& _pattern, bool _recursive, bool _dirs) { String pattern2 = _pattern; StringUtil::utf8ToAnsi(pattern2); FileInfoListPtr ret = mBaseArchive->findFileInfo(pattern2, _recursive, _dirs); for(size_t i = 0; i != ret->size(); ++i) { FileInfo& fi = (*ret)[i]; StringUtil::ansiToUtf8(fi.basename); StringUtil::ansiToUtf8(fi.filename); StringUtil::ansiToUtf8(fi.path); } return ret; }
//----------------------------------------------------------------------- DataStreamPtr ZipArchive::open(const String& filename, bool readOnly) const { // zziplib is not threadsafe OGRE_LOCK_AUTO_MUTEX; String lookUpFileName = filename; #if OGRE_RESOURCEMANAGER_STRICT const int flags = 0; #else const int flags = ZZIP_CASELESS; #endif // Format not used here (always binary) ZZIP_FILE* zzipFile = zzip_file_open(mZzipDir, lookUpFileName.c_str(), ZZIP_ONLYZIP | flags); #if !OGRE_RESOURCEMANAGER_STRICT if (!zzipFile) // Try if we find the file { String basename, path; StringUtil::splitFilename(lookUpFileName, basename, path); const FileInfoListPtr fileNfo = findFileInfo(basename, true); if (fileNfo->size() == 1) // If there are more files with the same do not open anyone { Ogre::FileInfo info = fileNfo->at(0); lookUpFileName = info.path + info.basename; zzipFile = zzip_file_open(mZzipDir, lookUpFileName.c_str(), ZZIP_ONLYZIP | flags); // When an error happens here we will catch it below } } #endif if (!zzipFile) { int zerr = zzip_error(mZzipDir); String zzDesc = getZzipErrorDescription((zzip_error_t)zerr); OGRE_EXCEPT(Exception::ERR_FILE_NOT_FOUND, mName+ " Cannot open file: " + lookUpFileName + " - "+zzDesc, "ZipArchive::open"); } // Get uncompressed size too ZZIP_STAT zstat; zzip_dir_stat(mZzipDir, lookUpFileName.c_str(), &zstat, flags); // Construct & return stream return DataStreamPtr(OGRE_NEW ZipDataStream(lookUpFileName, zzipFile, static_cast<size_t>(zstat.st_size))); }
Ogre::String GUIManager::getRandomWallpaperImage() { FileInfoListPtr files = Ogre::ResourceGroupManager::getSingleton().findResourceFileInfo("Wallpapers", "*.jpg", false); if(files.isNull() || files->empty()) { return ""; } srand ( time(NULL) ); int num = 0; for(int i = 0; i<Ogre::Math::RangeRandom(0, 10); i++) num = Ogre::Math::RangeRandom(0, files->size()); return files->at(num).filename; }
void ZipArchiveTests::testListFileInfoRecursive() { ZipArchive arch(testPath, "Zip"); arch.load(); FileInfoListPtr vec = arch.listFileInfo(true); CPPUNIT_ASSERT_EQUAL((size_t)6, vec->size()); FileInfo& fi3 = vec->at(0); CPPUNIT_ASSERT_EQUAL(String("level1/materials/scripts/file.material"), fi3.filename); CPPUNIT_ASSERT_EQUAL(String("file.material"), fi3.basename); CPPUNIT_ASSERT_EQUAL(String("level1/materials/scripts/"), fi3.path); CPPUNIT_ASSERT_EQUAL((size_t)0, fi3.compressedSize); CPPUNIT_ASSERT_EQUAL((size_t)0, fi3.uncompressedSize); FileInfo& fi4 = vec->at(1); CPPUNIT_ASSERT_EQUAL(String("level1/materials/scripts/file2.material"), fi4.filename); CPPUNIT_ASSERT_EQUAL(String("file2.material"), fi4.basename); CPPUNIT_ASSERT_EQUAL(String("level1/materials/scripts/"), fi4.path); CPPUNIT_ASSERT_EQUAL((size_t)0, fi4.compressedSize); CPPUNIT_ASSERT_EQUAL((size_t)0, fi4.uncompressedSize); FileInfo& fi5 = vec->at(2); CPPUNIT_ASSERT_EQUAL(String("level2/materials/scripts/file3.material"), fi5.filename); CPPUNIT_ASSERT_EQUAL(String("file3.material"), fi5.basename); CPPUNIT_ASSERT_EQUAL(String("level2/materials/scripts/"), fi5.path); CPPUNIT_ASSERT_EQUAL((size_t)0, fi5.compressedSize); CPPUNIT_ASSERT_EQUAL((size_t)0, fi5.uncompressedSize); FileInfo& fi6 = vec->at(3); CPPUNIT_ASSERT_EQUAL(String("level2/materials/scripts/file4.material"), fi6.filename); CPPUNIT_ASSERT_EQUAL(String("file4.material"), fi6.basename); CPPUNIT_ASSERT_EQUAL(String("level2/materials/scripts/"), fi6.path); CPPUNIT_ASSERT_EQUAL((size_t)0, fi6.compressedSize); CPPUNIT_ASSERT_EQUAL((size_t)0, fi6.uncompressedSize); FileInfo& fi1 = vec->at(4); CPPUNIT_ASSERT_EQUAL(String("rootfile.txt"), fi1.filename); CPPUNIT_ASSERT_EQUAL(String("rootfile.txt"), fi1.basename); CPPUNIT_ASSERT_EQUAL(StringUtil::BLANK, fi1.path); CPPUNIT_ASSERT_EQUAL((size_t)40, fi1.compressedSize); CPPUNIT_ASSERT_EQUAL((size_t)130, fi1.uncompressedSize); FileInfo& fi2 = vec->at(5); CPPUNIT_ASSERT_EQUAL(String("rootfile2.txt"), fi2.filename); CPPUNIT_ASSERT_EQUAL(String("rootfile2.txt"), fi2.basename); CPPUNIT_ASSERT_EQUAL(StringUtil::BLANK, fi2.path); CPPUNIT_ASSERT_EQUAL((size_t)45, fi2.compressedSize); CPPUNIT_ASSERT_EQUAL((size_t)156, fi2.uncompressedSize); }
void ZipArchiveTests::testListFileInfoNonRecursive() { ZipArchive arch(testPath, "Zip"); arch.load(); FileInfoListPtr vec = arch.listFileInfo(false); CPPUNIT_ASSERT_EQUAL((size_t)2, vec->size()); FileInfo& fi1 = vec->at(0); CPPUNIT_ASSERT_EQUAL(String("rootfile.txt"), fi1.filename); CPPUNIT_ASSERT_EQUAL(String("rootfile.txt"), fi1.basename); CPPUNIT_ASSERT_EQUAL(StringUtil::BLANK, fi1.path); CPPUNIT_ASSERT_EQUAL((size_t)40, fi1.compressedSize); CPPUNIT_ASSERT_EQUAL((size_t)130, fi1.uncompressedSize); FileInfo& fi2 = vec->at(1); CPPUNIT_ASSERT_EQUAL(String("rootfile2.txt"), fi2.filename); CPPUNIT_ASSERT_EQUAL(String("rootfile2.txt"), fi2.basename); CPPUNIT_ASSERT_EQUAL(StringUtil::BLANK, fi2.path); CPPUNIT_ASSERT_EQUAL((size_t)45, fi2.compressedSize); CPPUNIT_ASSERT_EQUAL((size_t)156, fi2.uncompressedSize); }
//----------------------------------------------------------------------- FileInfoListPtr ZipArchive::findFileInfo(const String& pattern, bool recursive, bool dirs) const { OGRE_LOCK_AUTO_MUTEX; FileInfoListPtr ret = FileInfoListPtr(OGRE_NEW_T(FileInfoList, MEMCATEGORY_GENERAL)(), SPFM_DELETE_T); // If pattern contains a directory name, do a full match bool full_match = (pattern.find ('/') != String::npos) || (pattern.find ('\\') != String::npos); bool wildCard = pattern.find("*") != String::npos; FileInfoList::const_iterator i, iend; iend = mFileList.end(); for (i = mFileList.begin(); i != iend; ++i) if ((dirs == (i->compressedSize == size_t (-1))) && (recursive || full_match || wildCard)) // Check name matches pattern (zip is case insensitive) if (StringUtil::match(full_match ? i->filename : i->basename, pattern, false)) ret->push_back(*i); return ret; }
void ZipArchiveTests::testFindFileInfoRecursive() { ZipArchive arch(testPath, "Zip"); arch.load(); FileInfoListPtr vec = arch.findFileInfo("*.material", true); CPPUNIT_ASSERT_EQUAL((size_t)4, vec->size()); FileInfo& fi3 = vec->at(0); CPPUNIT_ASSERT_EQUAL(String("level1/materials/scripts/file.material"), fi3.filename); CPPUNIT_ASSERT_EQUAL(String("file.material"), fi3.basename); CPPUNIT_ASSERT_EQUAL(String("level1/materials/scripts/"), fi3.path); CPPUNIT_ASSERT_EQUAL((size_t)0, fi3.compressedSize); CPPUNIT_ASSERT_EQUAL((size_t)0, fi3.uncompressedSize); FileInfo& fi4 = vec->at(1); CPPUNIT_ASSERT_EQUAL(String("level1/materials/scripts/file2.material"), fi4.filename); CPPUNIT_ASSERT_EQUAL(String("file2.material"), fi4.basename); CPPUNIT_ASSERT_EQUAL(String("level1/materials/scripts/"), fi4.path); CPPUNIT_ASSERT_EQUAL((size_t)0, fi4.compressedSize); CPPUNIT_ASSERT_EQUAL((size_t)0, fi4.uncompressedSize); FileInfo& fi5 = vec->at(2); CPPUNIT_ASSERT_EQUAL(String("level2/materials/scripts/file3.material"), fi5.filename); CPPUNIT_ASSERT_EQUAL(String("file3.material"), fi5.basename); CPPUNIT_ASSERT_EQUAL(String("level2/materials/scripts/"), fi5.path); CPPUNIT_ASSERT_EQUAL((size_t)0, fi5.compressedSize); CPPUNIT_ASSERT_EQUAL((size_t)0, fi5.uncompressedSize); FileInfo& fi6 = vec->at(3); CPPUNIT_ASSERT_EQUAL(String("level2/materials/scripts/file4.material"), fi6.filename); CPPUNIT_ASSERT_EQUAL(String("file4.material"), fi6.basename); CPPUNIT_ASSERT_EQUAL(String("level2/materials/scripts/"), fi6.path); CPPUNIT_ASSERT_EQUAL((size_t)0, fi6.compressedSize); CPPUNIT_ASSERT_EQUAL((size_t)0, fi6.uncompressedSize); }
void MeshObject::postProcess() { loaded=true; if(!sceneNode) return; // important: you need to add the LODs before creating the entity // now find possible LODs, needs to be done before calling createEntity() if(!mesh.isNull()) { String basename, ext; StringUtil::splitBaseFilename(meshName, basename, ext); String group = ResourceGroupManager::getSingleton().findGroupContainingResource(meshName); // the classic LODs FileInfoListPtr files = ResourceGroupManager::getSingleton().findResourceFileInfo(group, basename + "_lod*.mesh"); for (FileInfoList::iterator iterFiles = files->begin(); iterFiles!= files->end(); ++iterFiles) { String format = basename + "_lod%d.mesh"; int i = -1; int r = sscanf(iterFiles->filename.c_str(), format.c_str(), &i); if(r <= 0 || i < 0) continue; float distance = 3; // we need to tune this according to our sightrange float sightrange = PARSEREAL(SSETTING("SightRange")); if(sightrange > 4999) { // unlimited if (i == 1) distance = 200; else if(i == 2) distance = 600; else if(i == 3) distance = 2000; else if(i == 4) distance = 5000; } else { // limited if (i == 1) distance = std::max(20.0f, sightrange * 0.1f); else if(i == 2) distance = std::max(20.0f, sightrange * 0.2f); else if(i == 3) distance = std::max(20.0f, sightrange * 0.3f); else if(i == 4) distance = std::max(20.0f, sightrange * 0.4f); } Ogre::MeshManager::getSingleton().load(iterFiles->filename, mesh->getGroup()); mesh->createManualLodLevel(distance, iterFiles->filename); } // the custom LODs FileInfoListPtr files2 = ResourceGroupManager::getSingleton().findResourceFileInfo(group, basename + "_clod_*.mesh"); for (FileInfoList::iterator iterFiles = files2->begin(); iterFiles!= files2->end(); ++iterFiles) { // and custom LODs String format = basename + "_clod_%d.mesh"; int i = -1; int r = sscanf(iterFiles->filename.c_str(), format.c_str(), &i); if(r <= 0 || i < 0) continue; Ogre::MeshManager::getSingleton().load(iterFiles->filename, mesh->getGroup()); mesh->createManualLodLevel(i, iterFiles->filename); } } // now create an entity around the mesh and attach it to the scene graph try { if(entityName.empty()) ent = smgr->createEntity(meshName); else ent = smgr->createEntity(entityName, meshName); if(ent) sceneNode->attachObject(ent); } catch(Ogre::Exception& e) { LOG("error loading mesh: " + meshName + ": " + e.getFullDescription()); return; } // then modify some things if(enableSimpleMaterial) MaterialFunctionMapper::replaceSimpleMeshMaterials(ent, simpleMatColour); if(skin) skin->replaceMeshMaterials(ent); if(mfm) mfm->replaceMeshMaterials(ent); if(!materialName.empty()) ent->setMaterialName(materialName); // only set it if different from default (true) if(!castshadows && sceneNode && sceneNode->numAttachedObjects() > 0) sceneNode->getAttachedObject(0)->setCastShadows(castshadows); sceneNode->setVisible(visible); }
//-------------------------------------------------------------------------- void DirectMusicPlayContext::play(bool _3D, const String& _filename, const String& _resourceGroup) { // Stop if played already stop(); // Find the full path to the file. FileInfoListPtr fileinfos = ResourceGroupManager::getSingleton().findResourceFileInfo(_resourceGroup, _filename); if(fileinfos->empty()) GOTHOGRE_EXCEPT(_filename << " - File not found."); FileInfo& fi = (*fileinfos)[0]; String path = fi.archive->getName() + "/" + fi.path; // Convert the full path and the filename to UTF-16LE. CodepageConverter* utf16Conv = UnicodeUtil::openConverter("UTF-16LE"); CodepageConverter::ByteBuffer bbFileName, bbPath; utf16Conv->unicodeToBuffer(bbFileName, fi.basename); utf16Conv->unicodeToBuffer(bbPath, path); bbPath.push_back(0); bbPath.push_back(0); bbFileName.push_back(0); bbFileName.push_back(0); WCHAR* wszPath = (WCHAR*) bbPath.data(); WCHAR* wszFileName = (WCHAR*) bbFileName.data(); // Set the search path. DXError::check( mLoader->SetSearchDirectory( GUID_DirectMusicAllTypes, // Types of files sought. wszPath, // Where to look. FALSE ) ); // Don't clear object data // Create a segment from the file. DXError::check( mLoader->LoadObjectFromFile( CLSID_DirectMusicSegment, // Class identifier. IID_IDirectMusicSegment8, // ID of desired interface. wszFileName, // Filename. (LPVOID*) &mSegment ) ); // Pointer that receives interface. // Download instrumental data (DLS) to the audiopath. DXError::check( mSegment->Download( mAudioPath ) ); // Begin playback of the segment. DXError::check( mPerformance->PlaySegmentEx( mSegment, // Segment to play. NULL, // Used for songs; not implemented. NULL, // For transitions. 0, // Flags. 0, // Start time; 0 is immediate. &mSegmentState, // Pointer that receives segment state. NULL, // Object to stop. mAudioPath ) ); // Audiopath, if not default. // Write the new segment state to the static list sSSPCM.insert(mSegmentState, this); mPlaying = true; // Get playback length MUSIC_TIME mtLength; DXError::check( mSegment->GetLength(&mtLength) ); DXError::check( mSegment->GetStartPoint(&mStartMusicTime) ); mEndMusicTime = mtLength + mStartMusicTime; }