mirror of
https://github.com/redstrate/Novus.git
synced 2025-04-26 21:57:45 +00:00
common: Add cache for checking existence of files
This can speed up operations quickly, as files aren't expected to be changed, and it prevents an index read.
This commit is contained in:
parent
42f099f8ad
commit
e67011ad71
3 changed files with 19 additions and 8 deletions
|
@ -49,7 +49,7 @@ std::vector<std::pair<Race, Subrace>> GearView::supportedRaces() const {
|
|||
auto equip_path =
|
||||
physis_build_equipment_path(gear.modelInfo.primaryID, race, subrace, currentGender, gear.slot);
|
||||
|
||||
if (physis_gamedata_exists(data, equip_path))
|
||||
if (cache.fileExists(QLatin1String(equip_path)))
|
||||
races.emplace_back(race, subrace);
|
||||
}
|
||||
}
|
||||
|
@ -65,7 +65,7 @@ std::vector<Gender> GearView::supportedGenders() const {
|
|||
auto equip_path = physis_build_equipment_path(
|
||||
gear.modelInfo.primaryID, currentRace, Subrace::Midlander, currentGender, gear.slot);
|
||||
|
||||
if (physis_gamedata_exists(data, equip_path))
|
||||
if (cache.fileExists(QLatin1String(equip_path)))
|
||||
genders.push_back(gender);
|
||||
}
|
||||
}
|
||||
|
@ -230,12 +230,12 @@ void GearView::reloadModel() {
|
|||
const std::string mtrl_path = gear.getMtrlPath(material_name);
|
||||
const std::string skinmtrl_path = physis_build_skin_material_path(physis_get_race_code(fallbackRace, fallbackSubrace, currentGender), 1, material_name);
|
||||
|
||||
if (physis_gamedata_exists(data, mtrl_path.c_str())) {
|
||||
if (cache.fileExists(QLatin1String(mtrl_path.c_str()))) {
|
||||
auto mat = physis_material_parse(cache.lookupFile(mtrl_path.c_str()));
|
||||
materials.push_back(mat);
|
||||
}
|
||||
|
||||
if (physis_gamedata_exists(data, skinmtrl_path.c_str())) {
|
||||
if (cache.fileExists(QLatin1String(skinmtrl_path.c_str()))) {
|
||||
auto mat = physis_material_parse(cache.lookupFile(skinmtrl_path.c_str()));
|
||||
materials.push_back(mat);
|
||||
}
|
||||
|
@ -259,7 +259,7 @@ void GearView::reloadModel() {
|
|||
const char* material_name = mdl.material_names[i];
|
||||
const std::string skinmtrl_path = physis_build_face_material_path(physis_get_race_code(currentRace, currentSubrace, currentGender), *face, material_name);
|
||||
|
||||
if (physis_gamedata_exists(data, skinmtrl_path.c_str())) {
|
||||
if (cache.fileExists(QLatin1String(skinmtrl_path.c_str()))) {
|
||||
auto mat = physis_material_parse(cache.lookupFile(skinmtrl_path.c_str()));
|
||||
materials.push_back(mat);
|
||||
}
|
||||
|
@ -281,7 +281,7 @@ void GearView::reloadModel() {
|
|||
const char* material_name = mdl.material_names[i];
|
||||
const std::string skinmtrl_path = physis_build_hair_material_path(physis_get_race_code(currentRace, currentSubrace, currentGender), *hair, material_name);
|
||||
|
||||
if (physis_gamedata_exists(data, skinmtrl_path.c_str())) {
|
||||
if (cache.fileExists(QLatin1String(skinmtrl_path.c_str()))) {
|
||||
auto mat = physis_material_parse(cache.lookupFile(skinmtrl_path.c_str()));
|
||||
materials.push_back(mat);
|
||||
}
|
||||
|
@ -303,7 +303,7 @@ void GearView::reloadModel() {
|
|||
const char* material_name = mdl.material_names[i];
|
||||
const std::string skinmtrl_path = physis_build_ear_material_path(physis_get_race_code(currentRace, currentSubrace, currentGender), *ear, material_name);
|
||||
|
||||
if (physis_gamedata_exists(data, skinmtrl_path.c_str())) {
|
||||
if (cache.fileExists(QLatin1String(skinmtrl_path.c_str()))) {
|
||||
auto mat = physis_material_parse(cache.lookupFile(skinmtrl_path.c_str()));
|
||||
materials.push_back(mat);
|
||||
}
|
||||
|
@ -323,7 +323,7 @@ void GearView::reloadModel() {
|
|||
const char* material_name = mdl.material_names[0];
|
||||
const std::string skinmtrl_path = physis_build_tail_material_path(physis_get_race_code(currentRace, currentSubrace, currentGender), *tail, material_name);
|
||||
|
||||
if (physis_gamedata_exists(data, skinmtrl_path.c_str())) {
|
||||
if (cache.fileExists(QLatin1String(skinmtrl_path.c_str()))) {
|
||||
auto mat = physis_material_parse(cache.lookupFile(skinmtrl_path.c_str()));
|
||||
mdlPart->addModel(mdl, {mat}, currentLod);
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <QHash>
|
||||
#include <QMap>
|
||||
#include <QString>
|
||||
#include <physis.hpp>
|
||||
|
@ -13,9 +14,11 @@ class FileCache {
|
|||
public:
|
||||
explicit FileCache(GameData& data);
|
||||
|
||||
bool fileExists(const QLatin1String &path);
|
||||
physis_Buffer& lookupFile(const QString& path);
|
||||
|
||||
private:
|
||||
QMap<QString, physis_Buffer> cachedBuffers;
|
||||
QHash<QLatin1String, bool> cachedExist;
|
||||
GameData& data;
|
||||
};
|
|
@ -15,3 +15,11 @@ physis_Buffer& FileCache::lookupFile(const QString& path) {
|
|||
return cachedBuffers[path];
|
||||
}
|
||||
|
||||
bool FileCache::fileExists(const QLatin1String &path)
|
||||
{
|
||||
if (!cachedExist.contains(path)) {
|
||||
cachedExist[path] = physis_gamedata_exists(&data, path.data());
|
||||
}
|
||||
|
||||
return cachedExist[path];
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue