static std::vector<std::string> GetShaders(const std::string &sub_dir = "") { std::vector<std::string> paths = DoFileSearch({"*.glsl"}, { File::GetUserPath(D_SHADERS_IDX) + sub_dir, File::GetSysDirectory() + SHADERS_DIR DIR_SEP + sub_dir }); std::vector<std::string> result; for (std::string path : paths) result.push_back(std::regex_replace(path, std::regex("^.*/(.*)\\.glsl$"), "$1")); return result; }
static std::vector<std::string> GetShaders(const std::string& sub_dir = "") { std::vector<std::string> paths = DoFileSearch({".glsl"}, {File::GetUserPath(D_SHADERS_IDX) + sub_dir, File::GetSysDirectory() + SHADERS_DIR DIR_SEP + sub_dir}); std::vector<std::string> result; for (std::string path : paths) { std::string name; SplitPath(path, nullptr, &name, nullptr); result.push_back(name); } return result; }
GCMemcardDirectory::GCMemcardDirectory(const std::string& directory, int slot, u16 sizeMb, bool ascii, DiscIO::Country card_region, int gameId) : MemoryCardBase(slot, sizeMb), m_GameId(gameId), m_LastBlock(-1), m_hdr(slot, sizeMb, ascii), m_bat1(sizeMb), m_saves(0), m_SaveDirectory(directory), m_exiting(false) { // Use existing header data if available if (File::Exists(m_SaveDirectory + MC_HDR)) { File::IOFile hdrfile((m_SaveDirectory + MC_HDR), "rb"); hdrfile.ReadBytes(&m_hdr, BLOCK_SIZE); } std::vector<std::string> rFilenames = DoFileSearch({".gci"}, {m_SaveDirectory}); if (rFilenames.size() > 112) { Core::DisplayMessage("Warning: There are more than 112 save files on this memory card.\n" " Only loading the first 112 in the folder, unless the game ID is the " "same as the current game's ID", 4000); } for (const std::string& gciFile : rFilenames) { if (m_saves.size() == DIRLEN) { PanicAlertT( "There are too many GCI files in the folder\n%s.\nOnly the first 127 will be available", m_SaveDirectory.c_str()); break; } int index = LoadGCI(gciFile, card_region, m_saves.size() > 112); if (index != NO_INDEX) { m_loaded_saves.push_back(m_saves.at(index).m_gci_header.GCI_FileName()); } } m_loaded_saves.clear(); m_dir1.fixChecksums(); m_dir2 = m_dir1; m_bat2 = m_bat1; m_flush_thread = std::thread(&GCMemcardDirectory::FlushThread, this); }
void InterfaceConfigPane::LoadThemes() { auto sv = DoFileSearch({""}, {File::GetUserPath(D_THEMES_IDX), File::GetSysDirectory() + THEMES_DIR}, /*recursive*/ false); for (const std::string& filename : sv) { std::string name, ext; SplitPath(filename, nullptr, &name, &ext); name += ext; const wxString wxname = StrToWxStr(name); if (-1 == m_theme_choice->FindString(wxname)) m_theme_choice->Append(wxname); } m_theme_choice->SetStringSelection(StrToWxStr(SConfig::GetInstance().theme_name)); }
void CGameListCtrl::ScanForISOs() { ClearIsoFiles(); // Load custom game titles from titles.txt // http://www.gametdb.com/Wii/Downloads std::unordered_map<std::string, std::string> custom_title_map; std::ifstream titlestxt; OpenFStream(titlestxt, File::GetUserPath(D_LOAD_IDX) + "titles.txt", std::ios::in); if (!titlestxt.is_open()) OpenFStream(titlestxt, File::GetUserPath(D_LOAD_IDX) + "wiitdb.txt", std::ios::in); if (titlestxt.is_open()) { std::string line; while (!titlestxt.eof() && std::getline(titlestxt, line)) { const size_t equals_index = line.find('='); if (equals_index != std::string::npos) custom_title_map.emplace(StripSpaces(line.substr(0, equals_index)), StripSpaces(line.substr(equals_index + 1))); } titlestxt.close(); } std::vector<std::string> Extensions; if (SConfig::GetInstance().m_ListGC) Extensions.push_back(".gcm"); if (SConfig::GetInstance().m_ListWii || SConfig::GetInstance().m_ListGC) { Extensions.push_back(".iso"); Extensions.push_back(".ciso"); Extensions.push_back(".gcz"); Extensions.push_back(".wbfs"); } if (SConfig::GetInstance().m_ListWad) Extensions.push_back(".wad"); if (SConfig::GetInstance().m_ListElfDol) { Extensions.push_back(".dol"); Extensions.push_back(".elf"); } auto rFilenames = DoFileSearch(Extensions, SConfig::GetInstance().m_ISOFolder, SConfig::GetInstance().m_RecursiveISOFolder); if (rFilenames.size() > 0) { wxProgressDialog dialog( _("Scanning for ISOs"), _("Scanning..."), (int)rFilenames.size() - 1, this, wxPD_APP_MODAL | wxPD_AUTO_HIDE | wxPD_CAN_ABORT | wxPD_ELAPSED_TIME | wxPD_ESTIMATED_TIME | wxPD_REMAINING_TIME | wxPD_SMOOTH // - makes updates as small as possible (down to 1px) ); for (u32 i = 0; i < rFilenames.size(); i++) { std::string FileName; SplitPath(rFilenames[i], nullptr, &FileName, nullptr); // Update with the progress (i) and the message dialog.Update(i, wxString::Format(_("Scanning %s"), StrToWxStr(FileName))); if (dialog.WasCancelled()) break; auto iso_file = std::make_unique<GameListItem>(rFilenames[i], custom_title_map); if (iso_file->IsValid()) { bool list = true; switch(iso_file->GetPlatform()) { case DiscIO::IVolume::WII_DISC: if (!SConfig::GetInstance().m_ListWii) list = false; break; case DiscIO::IVolume::WII_WAD: if (!SConfig::GetInstance().m_ListWad) list = false; break; case DiscIO::IVolume::ELF_DOL: if (!SConfig::GetInstance().m_ListElfDol) list = false; break; default: if (!SConfig::GetInstance().m_ListGC) list = false; break; } switch(iso_file->GetCountry()) { case DiscIO::IVolume::COUNTRY_AUSTRALIA: if (!SConfig::GetInstance().m_ListAustralia) list = false; break; case DiscIO::IVolume::COUNTRY_EUROPE: if (!SConfig::GetInstance().m_ListPal) list = false; break; case DiscIO::IVolume::COUNTRY_FRANCE: if (!SConfig::GetInstance().m_ListFrance) list = false; break; case DiscIO::IVolume::COUNTRY_GERMANY: if (!SConfig::GetInstance().m_ListGermany) list = false; break; case DiscIO::IVolume::COUNTRY_ITALY: if (!SConfig::GetInstance().m_ListItaly) list = false; break; case DiscIO::IVolume::COUNTRY_JAPAN: if (!SConfig::GetInstance().m_ListJap) list = false; break; case DiscIO::IVolume::COUNTRY_KOREA: if (!SConfig::GetInstance().m_ListKorea) list = false; break; case DiscIO::IVolume::COUNTRY_NETHERLANDS: if (!SConfig::GetInstance().m_ListNetherlands) list = false; break; case DiscIO::IVolume::COUNTRY_RUSSIA: if (!SConfig::GetInstance().m_ListRussia) list = false; break; case DiscIO::IVolume::COUNTRY_SPAIN: if (!SConfig::GetInstance().m_ListSpain) list = false; break; case DiscIO::IVolume::COUNTRY_TAIWAN: if (!SConfig::GetInstance().m_ListTaiwan) list = false; break; case DiscIO::IVolume::COUNTRY_USA: if (!SConfig::GetInstance().m_ListUsa) list = false; break; case DiscIO::IVolume::COUNTRY_WORLD: if (!SConfig::GetInstance().m_ListWorld) list = false; break; case DiscIO::IVolume::COUNTRY_UNKNOWN: default: if (!SConfig::GetInstance().m_ListUnknown) list = false; break; } if (list) m_ISOFiles.push_back(iso_file.release()); } } } if (SConfig::GetInstance().m_ListDrives) { const std::vector<std::string> drives = cdio_get_devices(); for (const auto& drive : drives) { auto gli = std::make_unique<GameListItem>(drive, custom_title_map); if (gli->IsValid()) m_ISOFiles.push_back(gli.release()); } } std::sort(m_ISOFiles.begin(), m_ISOFiles.end()); }
void HiresTexture::Update() { s_check_native_format = false; s_check_new_format = false; if (s_prefetcher.joinable()) { s_textureCacheAbortLoading.Set(); s_prefetcher.join(); } if (!g_ActiveConfig.bHiresTextures) { s_textureMap.clear(); s_textureCache.clear(); size_sum.store(0); return; } if (!g_ActiveConfig.bCacheHiresTextures) { s_textureCache.clear(); size_sum.store(0); } s_textureMap.clear(); const std::string& gameCode = SConfig::GetInstance().m_strUniqueID; std::string szDir = StringFromFormat("%s%s", File::GetUserPath(D_HIRESTEXTURES_IDX).c_str(), gameCode.c_str()); std::string ddscode(".dds"); std::string cddscode(".DDS"); std::vector<std::string> Extensions = { ".png", ".dds" }; auto rFilenames = DoFileSearch(Extensions, { szDir }, /*recursive*/ true); const std::string code = StringFromFormat("%s_", gameCode.c_str()); const std::string miptag = "mip"; const std::string normaltag = ".nrm"; for (u32 i = 0; i < rFilenames.size(); i++) { std::string FileName; std::string Extension; SplitPath(rFilenames[i], nullptr, &FileName, &Extension); if (FileName.substr(0, code.length()) == code) { s_check_native_format = true; } else if (FileName.substr(0, s_format_prefix.length()) == s_format_prefix) { s_check_new_format = true; } else { // Discard wrong files continue; } const bool is_compressed = Extension.compare(ddscode) == 0 || Extension.compare(cddscode) == 0; const bool is_normal_map = hasEnding(FileName, normaltag); if (is_normal_map) { FileName = FileName.substr(0, FileName.size() - normaltag.size()); } hires_mip_level mip_level_detail(rFilenames[i], Extension, is_compressed); u32 level = 0; size_t idx = FileName.find_last_of('_'); std::string miplevel = FileName.substr(idx + 1, std::string::npos); if (miplevel.substr(0, miptag.length()) == miptag) { sscanf(miplevel.substr(3, std::string::npos).c_str(), "%i", &level); FileName = FileName.substr(0, idx); } HiresTextureCache::iterator iter = s_textureMap.find(FileName); u32 min_item_size = level + 1; if (iter == s_textureMap.end()) { HiresTextureCacheItem item(min_item_size); if (is_normal_map) { item.normal_map.resize(min_item_size); } std::vector<hires_mip_level> &dst = is_normal_map ? item.normal_map : item.color_map; dst[level] = mip_level_detail; s_textureMap.emplace(FileName, item); } else { std::vector<hires_mip_level> &dst = is_normal_map ? iter->second.normal_map : iter->second.color_map; if (dst.size() < min_item_size) { dst.resize(min_item_size); } dst[level] = mip_level_detail; } } if (g_ActiveConfig.bCacheHiresTextures && s_textureMap.size() > 0) { // remove cached but deleted textures auto iter = s_textureCache.begin(); while (iter != s_textureCache.end()) { if (s_textureMap.find(iter->first) == s_textureMap.end()) { size_sum.fetch_sub(iter->second->m_cached_data_size); iter = s_textureCache.erase(iter); } else { iter++; } } s_textureCacheAbortLoading.Clear(); s_prefetcher = std::thread(Prefetch); } }
void DGameTracker::ScanForGames() { setDisabled(true); delete m_watcher; m_watcher = new QFileSystemWatcher(this); for (std::string dir : SConfig::GetInstance().m_ISOFolder) m_watcher->addPath(QString::fromStdString(dir)); if (SConfig::GetInstance().m_RecursiveISOFolder) { for (std::string dir : FindSubdirectories(SConfig::GetInstance().m_ISOFolder, /*recursive*/ true)) m_watcher->addPath(QString::fromStdString(dir)); } std::vector<std::string> exts; if (SConfig::GetInstance().m_ListGC) { exts.push_back("*.gcm"); exts.push_back("*.gcz"); } if (SConfig::GetInstance().m_ListWii || SConfig::GetInstance().m_ListGC) { exts.push_back("*.iso"); exts.push_back("*.ciso"); exts.push_back("*.wbfs"); } if (SConfig::GetInstance().m_ListWad) exts.push_back("*.wad"); if (SConfig::GetInstance().m_ListElfDol) { exts.push_back("*.dol"); exts.push_back("*.elf"); } auto rFilenames = DoFileSearch(exts, SConfig::GetInstance().m_ISOFolder, SConfig::GetInstance().m_RecursiveISOFolder); QList<GameFile*> newItems; QStringList allItems; if (!rFilenames.empty()) { for (u32 i = 0; i < rFilenames.size(); i++) { std::string FileName; SplitPath(rFilenames[i], nullptr, &FileName, nullptr); QString NameAndPath = QString::fromStdString(rFilenames[i]); allItems.append(NameAndPath); if (m_games.keys().contains(NameAndPath)) continue; GameFile* obj = new GameFile(rFilenames[i]); if (obj->IsValid()) { bool list = true; switch (obj->GetCountry()) { case DiscIO::IVolume::COUNTRY_AUSTRALIA: if (!SConfig::GetInstance().m_ListAustralia) list = false; break; case DiscIO::IVolume::COUNTRY_EUROPE: if (!SConfig::GetInstance().m_ListPal) list = false; break; case DiscIO::IVolume::COUNTRY_FRANCE: if (!SConfig::GetInstance().m_ListFrance) list = false; break; case DiscIO::IVolume::COUNTRY_GERMANY: if (!SConfig::GetInstance().m_ListGermany) list = false; break; case DiscIO::IVolume::COUNTRY_ITALY: if (!SConfig::GetInstance().m_ListItaly) list = false; break; case DiscIO::IVolume::COUNTRY_JAPAN: if (!SConfig::GetInstance().m_ListJap) list = false; break; case DiscIO::IVolume::COUNTRY_KOREA: if (!SConfig::GetInstance().m_ListKorea) list = false; break; case DiscIO::IVolume::COUNTRY_NETHERLANDS: if (!SConfig::GetInstance().m_ListNetherlands) list = false; break; case DiscIO::IVolume::COUNTRY_RUSSIA: if (!SConfig::GetInstance().m_ListRussia) list = false; break; case DiscIO::IVolume::COUNTRY_SPAIN: if (!SConfig::GetInstance().m_ListSpain) list = false; break; case DiscIO::IVolume::COUNTRY_TAIWAN: if (!SConfig::GetInstance().m_ListTaiwan) list = false; break; case DiscIO::IVolume::COUNTRY_USA: if (!SConfig::GetInstance().m_ListUsa) list = false; break; case DiscIO::IVolume::COUNTRY_WORLD: if (!SConfig::GetInstance().m_ListWorld) list = false; break; case DiscIO::IVolume::COUNTRY_UNKNOWN: default: if (!SConfig::GetInstance().m_ListUnknown) list = false; break; } if (list) newItems.append(obj); } } } // Process all the new GameFiles for (GameFile* o : newItems) m_games.insert(o->GetFileName(), o); // Check for games that were removed QList<GameFile*> removedGames; for (QString& path : m_games.keys()) { if (!allItems.contains(path)) { removedGames.append(m_games.value(path)); m_games.remove(path); } } m_tree_widget->AddGames(newItems); m_grid_widget->AddGames(newItems); m_tree_widget->RemoveGames(removedGames); m_grid_widget->RemoveGames(removedGames); for (GameFile* file : removedGames) delete file; setDisabled(false); }
void HiresTexture::Update() { if (s_prefetcher.joinable()) { s_textureCacheAbortLoading.Set(); s_prefetcher.join(); } if (!g_ActiveConfig.bHiresTextures) { s_textureMap.clear(); s_textureCache.clear(); return; } if (!g_ActiveConfig.bCacheHiresTextures) { s_textureCache.clear(); } const std::string& game_id = SConfig::GetInstance().m_strUniqueID; const std::string texture_directory = GetTextureDirectory(game_id); std::vector<std::string> extensions { ".png", ".bmp", ".tga", ".dds", ".jpg" // Why not? Could be useful for large photo-like textures }; std::vector<std::string> filenames = DoFileSearch(extensions, {texture_directory}, /*recursive*/ true); const std::string code = game_id + "_"; for (auto& rFilename : filenames) { std::string FileName; SplitPath(rFilename, nullptr, &FileName, nullptr); if (FileName.substr(0, code.length()) == code) { s_textureMap[FileName] = rFilename; s_check_native_format = true; } if (FileName.substr(0, s_format_prefix.length()) == s_format_prefix) { s_textureMap[FileName] = rFilename; s_check_new_format = true; } } if (g_ActiveConfig.bCacheHiresTextures) { // remove cached but deleted textures auto iter = s_textureCache.begin(); while (iter != s_textureCache.end()) { if (s_textureMap.find(iter->first) == s_textureMap.end()) { iter = s_textureCache.erase(iter); } else { iter++; } } s_textureCacheAbortLoading.Clear(); s_prefetcher = std::thread(Prefetch); } }
void CFrame::GameListChanged(wxCommandEvent& event) { switch (event.GetId()) { case IDM_LIST_WII: SConfig::GetInstance().m_ListWii = event.IsChecked(); break; case IDM_LIST_GC: SConfig::GetInstance().m_ListGC = event.IsChecked(); break; case IDM_LIST_WAD: SConfig::GetInstance().m_ListWad = event.IsChecked(); break; case IDM_LIST_ELFDOL: SConfig::GetInstance().m_ListElfDol = event.IsChecked(); break; case IDM_LIST_JAP: SConfig::GetInstance().m_ListJap = event.IsChecked(); break; case IDM_LIST_PAL: SConfig::GetInstance().m_ListPal = event.IsChecked(); break; case IDM_LIST_USA: SConfig::GetInstance().m_ListUsa = event.IsChecked(); break; case IDM_LIST_AUSTRALIA: SConfig::GetInstance().m_ListAustralia = event.IsChecked(); break; case IDM_LIST_FRANCE: SConfig::GetInstance().m_ListFrance = event.IsChecked(); break; case IDM_LIST_GERMANY: SConfig::GetInstance().m_ListGermany = event.IsChecked(); break; case IDM_LIST_ITALY: SConfig::GetInstance().m_ListItaly = event.IsChecked(); break; case IDM_LIST_KOREA: SConfig::GetInstance().m_ListKorea = event.IsChecked(); break; case IDM_LIST_NETHERLANDS: SConfig::GetInstance().m_ListNetherlands = event.IsChecked(); break; case IDM_LIST_RUSSIA: SConfig::GetInstance().m_ListRussia = event.IsChecked(); break; case IDM_LIST_SPAIN: SConfig::GetInstance().m_ListSpain = event.IsChecked(); break; case IDM_LIST_TAIWAN: SConfig::GetInstance().m_ListTaiwan = event.IsChecked(); break; case IDM_LIST_WORLD: SConfig::GetInstance().m_ListWorld = event.IsChecked(); break; case IDM_LIST_UNKNOWN: SConfig::GetInstance().m_ListUnknown = event.IsChecked(); break; case IDM_LIST_DRIVES: SConfig::GetInstance().m_ListDrives = event.IsChecked(); break; case IDM_PURGE_GAME_LIST_CACHE: std::vector<std::string> rFilenames = DoFileSearch({".cache"}, {File::GetUserPath(D_CACHE_IDX)}); for (const std::string& rFilename : rFilenames) { File::Delete(rFilename); } break; } UpdateGameList(); }