From 63f636d401d35e6b5238cfd649f96a2c967323d5 Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 24 Sep 2022 15:35:12 +0200 Subject: [PATCH] Move statemap for technique loading to AssetLoaderTechniqueSet --- .../IW4/AssetLoaders/AssetLoaderMaterial.cpp | 31 +------------------ .../AssetLoaders/AssetLoaderTechniqueSet.cpp | 30 ++++++++++++++++++ .../AssetLoaders/AssetLoaderTechniqueSet.h | 2 ++ 3 files changed, 33 insertions(+), 30 deletions(-) diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMaterial.cpp b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMaterial.cpp index 60f2567a..4d8572a5 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMaterial.cpp +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderMaterial.cpp @@ -883,7 +883,7 @@ namespace IW4 GfxStateBits GetStateBitsForTechnique(const std::string& techniqueName) { - const auto* stateMap = GetStateMapForTechnique(techniqueName); + const auto* stateMap = AssetLoaderTechniqueSet::GetStateMapForTechnique(techniqueName, m_search_path, m_state_map_cache); if (!stateMap) return m_base_state_bits; @@ -897,35 +897,6 @@ namespace IW4 return stateBits; } - _NODISCARD const state_map::StateMapDefinition* GetStateMapForTechnique(const std::string& techniqueName) const - { - const auto* preloadedStateMap = m_state_map_cache->GetStateMapForTechnique(techniqueName); - if (preloadedStateMap) - return preloadedStateMap; - - const auto techniqueFileName = AssetLoaderTechniqueSet::GetTechniqueFileName(techniqueName); - const auto file = m_search_path->Open(techniqueFileName); - if (!file.IsOpen()) - { - std::cerr << "Failed to find file for technique \"" << techniqueName << "\"\n"; - return nullptr; - } - - state_map::StateMapFromTechniqueExtractor extractor; - const techset::TechniqueFileReader reader(*file.m_stream, techniqueFileName, &extractor); - if (!reader.ReadTechniqueDefinition()) - { - m_state_map_cache->SetTechniqueUsesStateMap(techniqueName, nullptr); - return nullptr; - } - - const auto stateMapName = extractor.RetrieveStateMap(); - const auto* loadedStateMap = AssetLoaderTechniqueSet::LoadStateMapDefinition(stateMapName, m_search_path, m_state_map_cache); - m_state_map_cache->SetTechniqueUsesStateMap(techniqueName, loadedStateMap); - - return loadedStateMap; - } - GfxStateBits CalculateStateBitsWithStateMap(const state_map::StateMapDefinition* stateMap) const { const state_map::StateMapHandler stateMapHandler(stateMapLayout, *stateMap); diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderTechniqueSet.cpp b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderTechniqueSet.cpp index ccd4eec0..8b99fe63 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderTechniqueSet.cpp +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderTechniqueSet.cpp @@ -17,6 +17,7 @@ #include "Techset/TechniqueFileReader.h" #include "Techset/TechsetFileReader.h" #include "Shader/D3D9ShaderAnalyser.h" +#include "StateMap/StateMapFromTechniqueExtractor.h" #include "StateMap/StateMapReader.h" #include "Techset/TechniqueStateMapCache.h" #include "Techset/TechsetDefinitionCache.h" @@ -1293,6 +1294,35 @@ bool AssetLoaderTechniqueSet::CreateTechsetFromDefinition(const std::string& ass return true; } +const state_map::StateMapDefinition* AssetLoaderTechniqueSet::GetStateMapForTechnique(const std::string& techniqueName, ISearchPath* searchPath, techset::TechniqueStateMapCache* stateMapCache) +{ + const auto* preloadedStateMap = stateMapCache->GetStateMapForTechnique(techniqueName); + if (preloadedStateMap) + return preloadedStateMap; + + const auto techniqueFileName = GetTechniqueFileName(techniqueName); + const auto file = searchPath->Open(techniqueFileName); + if (!file.IsOpen()) + { + std::cerr << "Failed to find file for technique \"" << techniqueName << "\"\n"; + return nullptr; + } + + state_map::StateMapFromTechniqueExtractor extractor; + const techset::TechniqueFileReader reader(*file.m_stream, techniqueFileName, &extractor); + if (!reader.ReadTechniqueDefinition()) + { + stateMapCache->SetTechniqueUsesStateMap(techniqueName, nullptr); + return nullptr; + } + + const auto stateMapName = extractor.RetrieveStateMap(); + const auto* loadedStateMap = LoadStateMapDefinition(stateMapName, searchPath, stateMapCache); + stateMapCache->SetTechniqueUsesStateMap(techniqueName, loadedStateMap); + + return loadedStateMap; +} + techset::TechsetDefinition* AssetLoaderTechniqueSet::LoadTechsetDefinition(const std::string& assetName, ISearchPath* searchPath, techset::TechsetDefinitionCache* definitionCache) { auto* cachedTechsetDefinition = definitionCache->GetCachedTechsetDefinition(assetName); diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderTechniqueSet.h b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderTechniqueSet.h index fe33e504..2338b032 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderTechniqueSet.h +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderTechniqueSet.h @@ -20,6 +20,8 @@ namespace IW4 static std::string GetTechniqueFileName(const std::string& techniqueName); static std::string GetStateMapFileName(const std::string& stateMapName); + static const state_map::StateMapDefinition* GetStateMapForTechnique(const std::string& techniqueName, ISearchPath* searchPath, techset::TechniqueStateMapCache* stateMapCache); + static techset::TechsetDefinition* LoadTechsetDefinition(const std::string& assetName, ISearchPath* searchPath, techset::TechsetDefinitionCache* definitionCache); static const state_map::StateMapDefinition* LoadStateMapDefinition(const std::string& stateMapName, ISearchPath* searchPath, techset::TechniqueStateMapCache* stateMapCache);