1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-26 13:47:46 +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:
Joshua Goins 2023-09-25 22:03:33 -04:00
parent 42f099f8ad
commit e67011ad71
3 changed files with 19 additions and 8 deletions

View file

@ -49,7 +49,7 @@ std::vector<std::pair<Race, Subrace>> GearView::supportedRaces() const {
auto equip_path = auto equip_path =
physis_build_equipment_path(gear.modelInfo.primaryID, race, subrace, currentGender, gear.slot); 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); races.emplace_back(race, subrace);
} }
} }
@ -65,7 +65,7 @@ std::vector<Gender> GearView::supportedGenders() const {
auto equip_path = physis_build_equipment_path( auto equip_path = physis_build_equipment_path(
gear.modelInfo.primaryID, currentRace, Subrace::Midlander, currentGender, gear.slot); 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); genders.push_back(gender);
} }
} }
@ -230,12 +230,12 @@ void GearView::reloadModel() {
const std::string mtrl_path = gear.getMtrlPath(material_name); 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); 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())); auto mat = physis_material_parse(cache.lookupFile(mtrl_path.c_str()));
materials.push_back(mat); 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())); auto mat = physis_material_parse(cache.lookupFile(skinmtrl_path.c_str()));
materials.push_back(mat); materials.push_back(mat);
} }
@ -259,7 +259,7 @@ void GearView::reloadModel() {
const char* material_name = mdl.material_names[i]; 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); 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())); auto mat = physis_material_parse(cache.lookupFile(skinmtrl_path.c_str()));
materials.push_back(mat); materials.push_back(mat);
} }
@ -281,7 +281,7 @@ void GearView::reloadModel() {
const char* material_name = mdl.material_names[i]; 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); 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())); auto mat = physis_material_parse(cache.lookupFile(skinmtrl_path.c_str()));
materials.push_back(mat); materials.push_back(mat);
} }
@ -303,7 +303,7 @@ void GearView::reloadModel() {
const char* material_name = mdl.material_names[i]; 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); 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())); auto mat = physis_material_parse(cache.lookupFile(skinmtrl_path.c_str()));
materials.push_back(mat); materials.push_back(mat);
} }
@ -323,7 +323,7 @@ void GearView::reloadModel() {
const char* material_name = mdl.material_names[0]; 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); 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())); auto mat = physis_material_parse(cache.lookupFile(skinmtrl_path.c_str()));
mdlPart->addModel(mdl, {mat}, currentLod); mdlPart->addModel(mdl, {mat}, currentLod);
} }

View file

@ -3,6 +3,7 @@
#pragma once #pragma once
#include <QHash>
#include <QMap> #include <QMap>
#include <QString> #include <QString>
#include <physis.hpp> #include <physis.hpp>
@ -13,9 +14,11 @@ class FileCache {
public: public:
explicit FileCache(GameData& data); explicit FileCache(GameData& data);
bool fileExists(const QLatin1String &path);
physis_Buffer& lookupFile(const QString& path); physis_Buffer& lookupFile(const QString& path);
private: private:
QMap<QString, physis_Buffer> cachedBuffers; QMap<QString, physis_Buffer> cachedBuffers;
QHash<QLatin1String, bool> cachedExist;
GameData& data; GameData& data;
}; };

View file

@ -15,3 +15,11 @@ physis_Buffer& FileCache::lookupFile(const QString& path) {
return cachedBuffers[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];
}