diff --git a/src/Common/StateMap/StateMapLayout.cpp b/src/Common/Techset/StateMap/StateMapLayout.cpp similarity index 100% rename from src/Common/StateMap/StateMapLayout.cpp rename to src/Common/Techset/StateMap/StateMapLayout.cpp diff --git a/src/Common/StateMap/StateMapLayout.h b/src/Common/Techset/StateMap/StateMapLayout.h similarity index 99% rename from src/Common/StateMap/StateMapLayout.h rename to src/Common/Techset/StateMap/StateMapLayout.h index 9bcb6166..811f80de 100644 --- a/src/Common/StateMap/StateMapLayout.h +++ b/src/Common/Techset/StateMap/StateMapLayout.h @@ -1,4 +1,5 @@ #pragma once + #include #include #include diff --git a/src/ObjCommon/Game/IW4/Techset/TechsetConstantsIW4.h b/src/ObjCommon/Game/IW4/Techset/TechsetConstantsIW4.h index 0f4f1a32..0881ff8c 100644 --- a/src/ObjCommon/Game/IW4/Techset/TechsetConstantsIW4.h +++ b/src/ObjCommon/Game/IW4/Techset/TechsetConstantsIW4.h @@ -2,8 +2,8 @@ #include "Game/IW4/CommonIW4.h" #include "Game/IW4/IW4.h" -#include "StateMap/StateMapLayout.h" #include "Techset/CommonTechset.h" +#include "Techset/StateMap/StateMapLayout.h" #include #include diff --git a/src/ObjCommon/Game/T6/Techset/TechsetConstantsT6.h b/src/ObjCommon/Game/T6/Techset/TechsetConstantsT6.h index 73569967..e71fdf6f 100644 --- a/src/ObjCommon/Game/T6/Techset/TechsetConstantsT6.h +++ b/src/ObjCommon/Game/T6/Techset/TechsetConstantsT6.h @@ -190,6 +190,11 @@ namespace T6 }; static_assert(std::extent_v == STREAM_DST_COUNT); + static inline techset::CommonStreamRoutingInfos commonRoutingInfos(streamRoutingSources, + std::extent_v, + streamRoutingDestinations, + std::extent_v); + static inline techset::CommonCodeConstSourceInfo commonCodeConstSources[]{ { .value = CONST_SRC_CODE_LIGHT_POSITION, @@ -1790,6 +1795,10 @@ namespace T6 .updateFrequency = techset::CommonCodeSourceUpdateFrequency::RARELY, }, }; + static inline techset::CommonCodeSourceInfos commonCodeSourceInfos(commonCodeConstSources, + std::extent_v, + commonCodeSamplerSources, + std::extent_v); static inline MaterialTypeInfo g_materialTypeInfo[]{ {"", "" }, diff --git a/src/ObjCommon/Techset/CommonTechnique.cpp b/src/ObjCommon/Techset/CommonTechnique.cpp index a28b2a9c..d1d25e3d 100644 --- a/src/ObjCommon/Techset/CommonTechnique.cpp +++ b/src/ObjCommon/Techset/CommonTechnique.cpp @@ -64,6 +64,11 @@ namespace techset { std::copy(sourceInfos, &sourceInfos[sourceCount], m_sources.data()); std::copy(destinationNames, &destinationNames[destinationCount], m_destinations.data()); + + for (size_t i = 0; i < sourceCount; i++) + m_source_lookup[sourceInfos[i].name] = static_cast(i); + for (size_t i = 0; i < destinationCount; i++) + m_destination_lookup[destinationNames[i].name] = static_cast(i); } const char* CommonStreamRoutingInfos::GetSourceName(const CommonStreamSource source) const @@ -105,4 +110,44 @@ namespace techset return m_destinations[destination].abbreviation; } + + std::optional CommonStreamRoutingInfos::GetSourceByName(const std::string& name) const + { + const auto foundSource = m_source_lookup.find(name); + if (foundSource != m_source_lookup.end()) + return foundSource->second; + + return std::nullopt; + } + + std::optional CommonStreamRoutingInfos::GetDestinationByName(const std::string& name) const + { + const auto foundDestination = m_destination_lookup.find(name); + if (foundDestination != m_destination_lookup.end()) + return foundDestination->second; + + return std::nullopt; + } + + CommonStreamRouting::CommonStreamRouting(const CommonStreamSource source, const CommonStreamDestination destination) + : m_source(source), + m_destination(destination) + { + } + + CommonTechniqueShader::CommonTechniqueShader(std::string name) + : m_name(std::move(name)) + { + } + + CommonTechnique::CommonTechnique() + : m_flags(0) + { + } + + CommonTechnique::CommonTechnique(std::string name) + : m_name(std::move(name)), + m_flags(0) + { + } } // namespace techset diff --git a/src/ObjCommon/Techset/CommonTechnique.h b/src/ObjCommon/Techset/CommonTechnique.h index 37dcfe3f..6d93070a 100644 --- a/src/ObjCommon/Techset/CommonTechnique.h +++ b/src/ObjCommon/Techset/CommonTechnique.h @@ -4,6 +4,7 @@ #include #include #include +#include #include namespace techset @@ -79,10 +80,14 @@ namespace techset [[nodiscard]] bool IsSourceOptional(CommonStreamSource source) const; [[nodiscard]] const char* GetDestinationName(CommonStreamDestination destination) const; [[nodiscard]] const char* GetDestinationAbbreviation(CommonStreamDestination destination) const; + [[nodiscard]] std::optional GetSourceByName(const std::string& name) const; + [[nodiscard]] std::optional GetDestinationByName(const std::string& name) const; private: std::vector m_sources; std::vector m_destinations; + std::unordered_map m_source_lookup; + std::unordered_map m_destination_lookup; }; union CommonShaderArgValue @@ -132,6 +137,8 @@ namespace techset class CommonShaderArg { public: + CommonShaderArg() = default; + CommonShaderArgType m_type; CommonShaderArgDestination m_destination; CommonShaderArgValue m_value; @@ -140,6 +147,9 @@ namespace techset class CommonStreamRouting { public: + CommonStreamRouting() = default; + CommonStreamRouting(CommonStreamSource source, CommonStreamDestination destination); + CommonStreamSource m_source; CommonStreamDestination m_destination; }; @@ -147,15 +157,26 @@ namespace techset class CommonVertexDeclaration { public: + CommonVertexDeclaration() = default; + std::vector m_routing; }; + class CommonTechniqueShaderBin + { + public: + const void* m_shader_bin; + size_t m_shader_bin_size; + }; + class CommonTechniqueShader { public: + CommonTechniqueShader() = default; + explicit CommonTechniqueShader(std::string name); + std::string m_name; - const void* m_shader_bin; - size_t m_shader_bin_size; + std::optional m_bin; std::vector m_args; }; @@ -168,7 +189,10 @@ namespace techset class CommonPass { public: + CommonPass() = default; + uint32_t m_sampler_flags; + std::string m_state_map; DxVersion m_dx_version; CommonTechniqueShader m_vertex_shader; CommonTechniqueShader m_pixel_shader; @@ -178,6 +202,9 @@ namespace techset class CommonTechnique { public: + CommonTechnique(); + explicit CommonTechnique(std::string name); + std::string m_name; uint64_t m_flags; std::vector m_passes; diff --git a/src/ObjCompiling/Game/T6/Techset/TechsetCompilerT6.cpp b/src/ObjCompiling/Game/T6/Techset/TechsetCompilerT6.cpp index 9a672a30..08556a66 100644 --- a/src/ObjCompiling/Game/T6/Techset/TechsetCompilerT6.cpp +++ b/src/ObjCompiling/Game/T6/Techset/TechsetCompilerT6.cpp @@ -2,9 +2,13 @@ #include "Game/T6/T6.h" #include "Game/T6/Techset/TechsetConstantsT6.h" +#include "Techset/CommonTechniqueLoader.h" #include "Techset/CommonTechsetLoader.h" +#include "Techset/TechniqueCache.h" #include "Techset/TechsetCommon.h" +#include + using namespace T6; namespace @@ -52,6 +56,30 @@ namespace return techset; } + MaterialTechnique* ConvertTechnique(const techset::CommonTechnique& commonTechnique, MemoryManager& memory) + { + const auto additionalPassCount = std::max(commonTechnique.m_passes.size(), 1u) - 1u; + auto* technique = static_cast(memory.AllocRaw(sizeof(MaterialTechnique) + additionalPassCount * sizeof(MaterialPass))); + + technique->name = memory.Dup(commonTechnique.m_name.c_str()); + technique->passCount = static_cast(commonTechnique.m_passes.size()); + + return technique; + } + + MaterialTechnique* LoadAndConvertTechnique(const std::string& techniqueName, techset::TechniqueCache& cache, MemoryManager& memory, ISearchPath& searchPath) + { + const auto commonTechnique = techset::LoadCommonTechnique(techniqueName, commonCodeSourceInfos, commonRoutingInfos, searchPath); + if (!commonTechnique) + return nullptr; + + auto* convertedTechnique = ConvertTechnique(*commonTechnique, memory); + assert(convertedTechnique); + cache.AddTechniqueToCache(techniqueName, convertedTechnique); + + return convertedTechnique; + } + class TechsetCompilerT6 final : public AssetCreator { public: @@ -69,6 +97,23 @@ namespace return failure ? AssetCreationResult::Failure() : AssetCreationResult::NoAction(); auto* techset = ConvertTechniqueSet(*commonTechset, m_memory); + auto& techniqueCache = context.GetZoneAssetCreationState(); + + for (auto techniqueIndex = 0u; techniqueIndex < std::extent_v; techniqueIndex++) + { + const auto& techniqueName = commonTechset->m_technique_names[techniqueIndex]; + if (techniqueName.empty()) + continue; + + auto* technique = techniqueCache.GetCachedTechnique(techniqueName); + if (!technique) + technique = LoadAndConvertTechnique(techniqueName, techniqueCache, m_memory, m_search_path); + + if (!technique) + return AssetCreationResult::Failure(); + + techset->techniques[techniqueIndex] = technique; + } return AssetCreationResult::Success(context.AddAsset(AssetRegistration(assetName, techset))); } diff --git a/src/ObjCompiling/Techset/CommonTechniqueLoader.cpp b/src/ObjCompiling/Techset/CommonTechniqueLoader.cpp index 4def5bcc..78af18bf 100644 --- a/src/ObjCompiling/Techset/CommonTechniqueLoader.cpp +++ b/src/ObjCompiling/Techset/CommonTechniqueLoader.cpp @@ -1 +1,42 @@ #include "CommonTechniqueLoader.h" + +#include "Parsing/Impl/CommentRemovingStreamProxy.h" +#include "Parsing/Impl/ParserSingleInputStream.h" +#include "Parsing/Simple/SimpleLexer.h" +#include "Parsing/TechniqueFileParser.h" +#include "Techset/TechsetCommon.h" +#include "Utils/Logging/Log.h" + +namespace techset +{ + std::unique_ptr LoadCommonTechnique(const std::string& techniqueName, + const CommonCodeSourceInfos& codeSourceInfos, + const CommonStreamRoutingInfos& routingInfos, + ISearchPath& searchPath) + { + const auto fileName = GetFileNameForTechniqueName(techniqueName); + const auto techniqueFile = searchPath.Open(fileName); + if (!techniqueFile.IsOpen()) + return nullptr; + + SimpleLexer::Config lexerConfig; + lexerConfig.m_emit_new_line_tokens = false; + lexerConfig.m_read_strings = true; + lexerConfig.m_string_escape_sequences = false; + lexerConfig.m_read_integer_numbers = true; + lexerConfig.m_read_floating_point_numbers = true; + + const auto baseStream = std::make_unique(*techniqueFile.m_stream, fileName); + const auto commentProxy = std::make_unique(baseStream.get()); + const auto lexer = std::make_unique(commentProxy.get(), std::move(lexerConfig)); + + const auto parser = std::make_unique(*lexer, techniqueName, codeSourceInfos, routingInfos); + + const auto success = parser->Parse(); + if (success) + return parser->GetParsingResult(); + + con::error("Parsing technique file \"{}\" failed!", fileName); + return nullptr; + } +} // namespace techset diff --git a/src/ObjCompiling/Techset/CommonTechniqueLoader.h b/src/ObjCompiling/Techset/CommonTechniqueLoader.h index 70722720..ba4570c3 100644 --- a/src/ObjCompiling/Techset/CommonTechniqueLoader.h +++ b/src/ObjCompiling/Techset/CommonTechniqueLoader.h @@ -7,6 +7,8 @@ namespace techset { - std::unique_ptr - LoadCommonTechnique(const AssetCreationContext& context, const CommonCodeSourceInfos& codeSourceInfos, const CommonStreamRoutingInfos& routingInfos); + std::unique_ptr LoadCommonTechnique(const std::string& techniqueName, + const CommonCodeSourceInfos& codeSourceInfos, + const CommonStreamRoutingInfos& routingInfos, + ISearchPath& searchPath); } // namespace techset diff --git a/src/ObjCompiling/Techset/Parsing/Sequence/TechniqueNoScopeSequences.cpp b/src/ObjCompiling/Techset/Parsing/Sequence/TechniqueNoScopeSequences.cpp index f94e1a71..baad556e 100644 --- a/src/ObjCompiling/Techset/Parsing/Sequence/TechniqueNoScopeSequences.cpp +++ b/src/ObjCompiling/Techset/Parsing/Sequence/TechniqueNoScopeSequences.cpp @@ -23,10 +23,8 @@ namespace techset protected: void ProcessMatch(TechniqueParserState* state, SequenceResult& result) const override { - assert(state->m_in_pass == false); - state->m_in_pass = true; - - state->m_acceptor->AcceptNextPass(); + assert(!state->m_current_pass); + state->m_current_pass = CommonPass(); } }; } // namespace techset diff --git a/src/ObjCompiling/Techset/Parsing/Sequence/TechniquePassScopeSequences.cpp b/src/ObjCompiling/Techset/Parsing/Sequence/TechniquePassScopeSequences.cpp index fca643b8..7fc51627 100644 --- a/src/ObjCompiling/Techset/Parsing/Sequence/TechniquePassScopeSequences.cpp +++ b/src/ObjCompiling/Techset/Parsing/Sequence/TechniquePassScopeSequences.cpp @@ -26,20 +26,17 @@ namespace techset protected: void ProcessMatch(TechniqueParserState* state, SequenceResult& result) const override { - assert(state->m_in_pass == true); + assert(state->m_current_pass); + assert(state->m_technique); - std::string errorMessage; - if (!state->m_acceptor->AcceptEndPass(errorMessage)) - throw ParsingException(result.NextCapture(CAPTURE_FIRST_TOKEN).GetPos(), errorMessage); - - state->m_in_pass = false; + state->m_technique->m_passes.emplace_back(std::move(*state->m_current_pass)); + state->m_current_pass = std::nullopt; } }; class SequenceStateMap final : public TechniqueParser::sequence_t { - static constexpr auto CAPTURE_START = 1; - static constexpr auto CAPTURE_STATE_MAP_NAME = 2; + static constexpr auto CAPTURE_STATE_MAP_NAME = 1; public: SequenceStateMap() @@ -47,7 +44,7 @@ namespace techset const SimpleMatcherFactory create(this); AddMatchers({ - create.Keyword("stateMap").Capture(CAPTURE_START), + create.Keyword("stateMap"), create.String().Capture(CAPTURE_STATE_MAP_NAME), create.Char(';'), }); @@ -56,13 +53,9 @@ namespace techset protected: void ProcessMatch(TechniqueParserState* state, SequenceResult& result) const override { - const auto& firstToken = result.NextCapture(CAPTURE_START); + assert(state->m_current_pass); - std::string errorMessage; - const auto acceptorResult = state->m_acceptor->AcceptStateMap(result.NextCapture(CAPTURE_STATE_MAP_NAME).StringValue(), errorMessage); - - if (!acceptorResult) - throw ParsingException(firstToken.GetPos(), std::move(errorMessage)); + state->m_current_pass->m_state_map = result.NextCapture(CAPTURE_STATE_MAP_NAME).StringValue(); } }; @@ -71,11 +64,10 @@ namespace techset static constexpr auto TAG_VERTEX_SHADER = 1; static constexpr auto TAG_PIXEL_SHADER = 2; - static constexpr auto CAPTURE_START = 1; - static constexpr auto CAPTURE_VERSION = 2; - static constexpr auto CAPTURE_VERSION_MAJOR = 3; - static constexpr auto CAPTURE_VERSION_MINOR = 4; - static constexpr auto CAPTURE_SHADER_NAME = 5; + static constexpr auto CAPTURE_VERSION = 1; + static constexpr auto CAPTURE_VERSION_MAJOR = 2; + static constexpr auto CAPTURE_VERSION_MINOR = 3; + static constexpr auto CAPTURE_SHADER_NAME = 4; public: SequenceShader() @@ -83,12 +75,10 @@ namespace techset const SimpleMatcherFactory create(this); AddMatchers({ - create - .Or({ - create.Keyword("vertexShader").Tag(TAG_VERTEX_SHADER), - create.Keyword("pixelShader").Tag(TAG_PIXEL_SHADER), - }) - .Capture(CAPTURE_START), + create.Or({ + create.Keyword("vertexShader").Tag(TAG_VERTEX_SHADER), + create.Keyword("pixelShader").Tag(TAG_PIXEL_SHADER), + }), create.Or({ create.And({ create.Integer().Capture(CAPTURE_VERSION_MAJOR), @@ -106,31 +96,18 @@ namespace techset protected: void ProcessMatch(TechniqueParserState* state, SequenceResult& result) const override { - const auto& firstToken = result.NextCapture(CAPTURE_START); - // Don't care about shader version since it's stated in the shader bin anyway const auto& shaderNameToken = result.NextCapture(CAPTURE_SHADER_NAME); - bool acceptorResult; - std::string errorMessage; const auto shaderTag = result.NextTag(); assert(shaderTag == TAG_VERTEX_SHADER || shaderTag == TAG_PIXEL_SHADER); + + state->m_current_shader = CommonTechniqueShader(shaderNameToken.StringValue()); if (shaderTag == TAG_VERTEX_SHADER) - { - acceptorResult = state->m_acceptor->AcceptVertexShader(shaderNameToken.StringValue(), errorMessage); - state->m_current_shader = ShaderSelector::VERTEX_SHADER; - } + state->m_current_shader_type = TechniqueParserShaderType::VERTEX; else - { - acceptorResult = state->m_acceptor->AcceptPixelShader(shaderNameToken.StringValue(), errorMessage); - state->m_current_shader = ShaderSelector::PIXEL_SHADER; - } - - state->m_in_shader = true; - - if (!acceptorResult) - throw ParsingException(firstToken.GetPos(), std::move(errorMessage)); + state->m_current_shader_type = TechniqueParserShaderType::PIXEL; } }; @@ -191,13 +168,23 @@ namespace techset protected: void ProcessMatch(TechniqueParserState* state, SequenceResult& result) const override { - const auto& firstToken = result.NextCapture(CAPTURE_FIRST_TOKEN); - const std::string destinationString = CreateRoutingString(result, CAPTURE_STREAM_DESTINATION_NAME, CAPTURE_STREAM_DESTINATION_INDEX); - const std::string sourceString = CreateRoutingString(result, CAPTURE_STREAM_SOURCE_NAME, CAPTURE_STREAM_SOURCE_INDEX); + assert(state->m_current_pass); - std::string errorMessage; - if (!state->m_acceptor->AcceptVertexStreamRouting(destinationString, sourceString, errorMessage)) - throw ParsingException(firstToken.GetPos(), std::move(errorMessage)); + const auto& firstToken = result.NextCapture(CAPTURE_FIRST_TOKEN); + + const std::string destinationString = CreateRoutingString(result, CAPTURE_STREAM_DESTINATION_NAME, CAPTURE_STREAM_DESTINATION_INDEX); + const auto maybeDestination = state->m_routing_infos.GetDestinationByName(destinationString); + + if (!maybeDestination.has_value()) + throw ParsingException(firstToken.GetPos(), "Unknown routing destination"); + + const std::string sourceString = CreateRoutingString(result, CAPTURE_STREAM_SOURCE_NAME, CAPTURE_STREAM_SOURCE_INDEX); + const auto maybeSource = state->m_routing_infos.GetSourceByName(sourceString); + + if (!maybeSource.has_value()) + throw ParsingException(firstToken.GetPos(), "Unknown routing source"); + + state->m_current_pass->m_vertex_declaration.m_routing.emplace_back(*maybeSource, *maybeDestination); } }; } // namespace techset diff --git a/src/ObjCompiling/Techset/Parsing/Sequence/TechniqueShaderScopeSequences.cpp b/src/ObjCompiling/Techset/Parsing/Sequence/TechniqueShaderScopeSequences.cpp index 5811a145..d5bbaa09 100644 --- a/src/ObjCompiling/Techset/Parsing/Sequence/TechniqueShaderScopeSequences.cpp +++ b/src/ObjCompiling/Techset/Parsing/Sequence/TechniqueShaderScopeSequences.cpp @@ -23,8 +23,15 @@ namespace techset protected: void ProcessMatch(TechniqueParserState* state, SequenceResult& result) const override { - assert(state->m_in_shader == true); - state->m_in_shader = false; + assert(state->m_current_pass); + assert(state->m_current_shader); + + if (state->m_current_shader_type == TechniqueParserShaderType::VERTEX) + state->m_current_pass->m_vertex_shader = std::move(*state->m_current_shader); + else + state->m_current_pass->m_pixel_shader = std::move(*state->m_current_shader); + + state->m_current_shader = std::nullopt; } }; @@ -203,7 +210,7 @@ namespace techset protected: void ProcessMatch(TechniqueParserState* state, SequenceResult& result) const override { - assert(state->m_in_shader == true); + assert(state->m_current_shader); const auto& shaderArgumentNameToken = result.NextCapture(CAPTURE_SHADER_ARGUMENT); diff --git a/src/ObjCompiling/Techset/Parsing/TechniqueFileParser.cpp b/src/ObjCompiling/Techset/Parsing/TechniqueFileParser.cpp index 1032d6ed..8e7c87ac 100644 --- a/src/ObjCompiling/Techset/Parsing/TechniqueFileParser.cpp +++ b/src/ObjCompiling/Techset/Parsing/TechniqueFileParser.cpp @@ -4,20 +4,29 @@ #include "Sequence/TechniquePassScopeSequences.h" #include "Sequence/TechniqueShaderScopeSequences.h" -using namespace techset; - -TechniqueParser::TechniqueParser(SimpleLexer* lexer, ITechniqueDefinitionAcceptor* acceptor) - : AbstractParser(lexer, std::make_unique(acceptor)) +namespace techset { -} + TechniqueParser::TechniqueParser(SimpleLexer& lexer, + std::string techniqueName, + const CommonCodeSourceInfos& codeSourceInfos, + const CommonStreamRoutingInfos& routingInfos) + : AbstractParser(&lexer, std::make_unique(std::move(techniqueName), codeSourceInfos, routingInfos)) + { + } -const std::vector& TechniqueParser::GetTestsForState() -{ - if (m_state->m_in_shader) - return TechniqueShaderScopeSequences::GetSequences(); + std::unique_ptr TechniqueParser::GetParsingResult() const + { + return std::move(m_state->m_technique); + } - if (m_state->m_in_pass) - return TechniquePassScopeSequences::GetSequences(); + const std::vector& TechniqueParser::GetTestsForState() + { + if (m_state->m_in_shader) + return TechniqueShaderScopeSequences::GetSequences(); - return TechniqueNoScopeSequences::GetSequences(); -} + if (m_state->m_in_pass) + return TechniquePassScopeSequences::GetSequences(); + + return TechniqueNoScopeSequences::GetSequences(); + } +} // namespace techset diff --git a/src/ObjCompiling/Techset/Parsing/TechniqueFileParser.h b/src/ObjCompiling/Techset/Parsing/TechniqueFileParser.h index 8944f573..6885e306 100644 --- a/src/ObjCompiling/Techset/Parsing/TechniqueFileParser.h +++ b/src/ObjCompiling/Techset/Parsing/TechniqueFileParser.h @@ -4,15 +4,20 @@ #include "Parsing/Simple/SimpleLexer.h" #include "Parsing/Simple/SimpleParserValue.h" #include "TechniqueFileParserState.h" +#include "Techset/CommonTechnique.h" namespace techset { class TechniqueParser final : public AbstractParser { + public: + TechniqueParser(SimpleLexer& lexer, + std::string techniqueName, + const CommonCodeSourceInfos& codeSourceInfos, + const CommonStreamRoutingInfos& routingInfos); + [[nodiscard]] std::unique_ptr GetParsingResult() const; + protected: const std::vector& GetTestsForState() override; - - public: - TechniqueParser(SimpleLexer* lexer, ITechniqueDefinitionAcceptor* acceptor); }; } // namespace techset diff --git a/src/ObjCompiling/Techset/Parsing/TechniqueFileParserState.cpp b/src/ObjCompiling/Techset/Parsing/TechniqueFileParserState.cpp index 97cdfa52..57cb5802 100644 --- a/src/ObjCompiling/Techset/Parsing/TechniqueFileParserState.cpp +++ b/src/ObjCompiling/Techset/Parsing/TechniqueFileParserState.cpp @@ -1,14 +1,16 @@ #include "TechniqueFileParserState.h" -#include - -using namespace techset; - -TechniqueParserState::TechniqueParserState(ITechniqueDefinitionAcceptor* acceptor) - : m_acceptor(acceptor), - m_in_pass(false), - m_in_shader(false), - m_current_shader(ShaderSelector::VERTEX_SHADER) +namespace techset { - assert(acceptor); -} + TechniqueParserState::TechniqueParserState(std::string techniqueName, + const CommonCodeSourceInfos& codeSourceInfos, + const CommonStreamRoutingInfos& routingInfos) + : m_technique(std::make_unique(std::move(techniqueName))), + m_code_source_infos(codeSourceInfos), + m_routing_infos(routingInfos), + m_in_pass(false), + m_in_shader(false), + m_current_shader(ShaderSelector::VERTEX_SHADER) + { + } +} // namespace techset diff --git a/src/ObjCompiling/Techset/Parsing/TechniqueFileParserState.h b/src/ObjCompiling/Techset/Parsing/TechniqueFileParserState.h index b97b143c..7e34fb5b 100644 --- a/src/ObjCompiling/Techset/Parsing/TechniqueFileParserState.h +++ b/src/ObjCompiling/Techset/Parsing/TechniqueFileParserState.h @@ -1,18 +1,30 @@ #pragma once -#include "Techset/TechniqueDefinitionAcceptor.h" +#include "Techset/CommonTechnique.h" + +#include +#include namespace techset { + enum class TechniqueParserShaderType : std::uint8_t + { + VERTEX, + PIXEL + }; + class TechniqueParserState { public: - explicit TechniqueParserState(ITechniqueDefinitionAcceptor* acceptor); + TechniqueParserState(std::string techniqueName, const CommonCodeSourceInfos& codeSourceInfos, const CommonStreamRoutingInfos& routingInfos); - ITechniqueDefinitionAcceptor* const m_acceptor; + std::unique_ptr m_technique; - bool m_in_pass; - bool m_in_shader; - ShaderSelector m_current_shader; + const CommonCodeSourceInfos& m_code_source_infos; + const CommonStreamRoutingInfos& m_routing_infos; + + std::optional m_current_pass; + std::optional m_current_shader; + TechniqueParserShaderType m_current_shader_type; }; } // namespace techset diff --git a/src/ObjLoading/StateMap/Parsing/Matcher/StateMapExpressionMatchers.cpp b/src/ObjCompiling/Techset/StateMap/Parsing/Matcher/StateMapExpressionMatchers.cpp similarity index 100% rename from src/ObjLoading/StateMap/Parsing/Matcher/StateMapExpressionMatchers.cpp rename to src/ObjCompiling/Techset/StateMap/Parsing/Matcher/StateMapExpressionMatchers.cpp diff --git a/src/ObjLoading/StateMap/Parsing/Matcher/StateMapExpressionMatchers.h b/src/ObjCompiling/Techset/StateMap/Parsing/Matcher/StateMapExpressionMatchers.h similarity index 91% rename from src/ObjLoading/StateMap/Parsing/Matcher/StateMapExpressionMatchers.h rename to src/ObjCompiling/Techset/StateMap/Parsing/Matcher/StateMapExpressionMatchers.h index 1480bd91..b3a48882 100644 --- a/src/ObjLoading/StateMap/Parsing/Matcher/StateMapExpressionMatchers.h +++ b/src/ObjCompiling/Techset/StateMap/Parsing/Matcher/StateMapExpressionMatchers.h @@ -1,7 +1,7 @@ #pragma once #include "Parsing/Simple/Expression/SimpleExpressionMatchers.h" -#include "StateMap/Parsing/StateMapParserState.h" +#include "Techset/StateMap/Parsing/StateMapParserState.h" #include diff --git a/src/ObjLoading/StateMap/Parsing/StateMapParser.cpp b/src/ObjCompiling/Techset/StateMap/Parsing/StateMapParser.cpp similarity index 100% rename from src/ObjLoading/StateMap/Parsing/StateMapParser.cpp rename to src/ObjCompiling/Techset/StateMap/Parsing/StateMapParser.cpp diff --git a/src/ObjLoading/StateMap/Parsing/StateMapParser.h b/src/ObjCompiling/Techset/StateMap/Parsing/StateMapParser.h similarity index 71% rename from src/ObjLoading/StateMap/Parsing/StateMapParser.h rename to src/ObjCompiling/Techset/StateMap/Parsing/StateMapParser.h index dad1bcca..559eee6b 100644 --- a/src/ObjLoading/StateMap/Parsing/StateMapParser.h +++ b/src/ObjCompiling/Techset/StateMap/Parsing/StateMapParser.h @@ -4,8 +4,6 @@ #include "Parsing/Simple/SimpleLexer.h" #include "Parsing/Simple/SimpleParserValue.h" #include "StateMapParserState.h" -#include "Techset/TechsetDefinition.h" -#include "Utils/ClassUtils.h" namespace state_map { @@ -16,7 +14,7 @@ namespace state_map public: StateMapParser(SimpleLexer* lexer, std::string stateMapName, const StateMapLayout& layout); - _NODISCARD std::unique_ptr GetStateMapDefinition() const; - _NODISCARD StateMapParserState* GetState() const; + [[nodiscard]] std::unique_ptr GetStateMapDefinition() const; + [[nodiscard]] StateMapParserState* GetState() const; }; } // namespace state_map diff --git a/src/ObjLoading/StateMap/Parsing/StateMapParserState.cpp b/src/ObjCompiling/Techset/StateMap/Parsing/StateMapParserState.cpp similarity index 100% rename from src/ObjLoading/StateMap/Parsing/StateMapParserState.cpp rename to src/ObjCompiling/Techset/StateMap/Parsing/StateMapParserState.cpp diff --git a/src/ObjLoading/StateMap/Parsing/StateMapParserState.h b/src/ObjCompiling/Techset/StateMap/Parsing/StateMapParserState.h similarity index 88% rename from src/ObjLoading/StateMap/Parsing/StateMapParserState.h rename to src/ObjCompiling/Techset/StateMap/Parsing/StateMapParserState.h index 260d4e66..f32c64e3 100644 --- a/src/ObjLoading/StateMap/Parsing/StateMapParserState.h +++ b/src/ObjCompiling/Techset/StateMap/Parsing/StateMapParserState.h @@ -1,7 +1,7 @@ #pragma once -#include "StateMap/StateMapDefinition.h" -#include "StateMap/StateMapLayout.h" +#include "Techset/StateMap/StateMapDefinition.h" +#include "Techset/StateMap/StateMapLayout.h" #include #include diff --git a/src/ObjLoading/StateMap/StateMapDefinition.cpp b/src/ObjCompiling/Techset/StateMap/StateMapDefinition.cpp similarity index 100% rename from src/ObjLoading/StateMap/StateMapDefinition.cpp rename to src/ObjCompiling/Techset/StateMap/StateMapDefinition.cpp diff --git a/src/ObjLoading/StateMap/StateMapDefinition.h b/src/ObjCompiling/Techset/StateMap/StateMapDefinition.h similarity index 100% rename from src/ObjLoading/StateMap/StateMapDefinition.h rename to src/ObjCompiling/Techset/StateMap/StateMapDefinition.h diff --git a/src/ObjLoading/StateMap/StateMapFromTechniqueExtractor.cpp b/src/ObjCompiling/Techset/StateMap/StateMapFromTechniqueExtractor.cpp similarity index 100% rename from src/ObjLoading/StateMap/StateMapFromTechniqueExtractor.cpp rename to src/ObjCompiling/Techset/StateMap/StateMapFromTechniqueExtractor.cpp diff --git a/src/ObjLoading/StateMap/StateMapFromTechniqueExtractor.h b/src/ObjCompiling/Techset/StateMap/StateMapFromTechniqueExtractor.h similarity index 100% rename from src/ObjLoading/StateMap/StateMapFromTechniqueExtractor.h rename to src/ObjCompiling/Techset/StateMap/StateMapFromTechniqueExtractor.h diff --git a/src/ObjLoading/StateMap/StateMapHandler.cpp b/src/ObjCompiling/Techset/StateMap/StateMapHandler.cpp similarity index 100% rename from src/ObjLoading/StateMap/StateMapHandler.cpp rename to src/ObjCompiling/Techset/StateMap/StateMapHandler.cpp diff --git a/src/ObjLoading/StateMap/StateMapHandler.h b/src/ObjCompiling/Techset/StateMap/StateMapHandler.h similarity index 81% rename from src/ObjLoading/StateMap/StateMapHandler.h rename to src/ObjCompiling/Techset/StateMap/StateMapHandler.h index 6c421376..1dec3b06 100644 --- a/src/ObjLoading/StateMap/StateMapHandler.h +++ b/src/ObjCompiling/Techset/StateMap/StateMapHandler.h @@ -1,8 +1,7 @@ #pragma once -#include "StateMap/StateMapDefinition.h" -#include "StateMap/StateMapLayout.h" -#include "Utils/ClassUtils.h" +#include "Techset/StateMap/StateMapDefinition.h" +#include "Techset/StateMap/StateMapLayout.h" #include #include @@ -13,7 +12,7 @@ namespace state_map { public: void AddValue(std::string key, std::string value); - _NODISCARD SimpleExpressionValue ValueByName(const std::string& name) const override; + [[nodiscard]] SimpleExpressionValue ValueByName(const std::string& name) const override; private: std::unordered_map m_vars; diff --git a/src/ObjLoading/StateMap/StateMapReader.cpp b/src/ObjCompiling/Techset/StateMap/StateMapReader.cpp similarity index 100% rename from src/ObjLoading/StateMap/StateMapReader.cpp rename to src/ObjCompiling/Techset/StateMap/StateMapReader.cpp diff --git a/src/ObjLoading/StateMap/StateMapReader.h b/src/ObjCompiling/Techset/StateMap/StateMapReader.h similarity index 72% rename from src/ObjLoading/StateMap/StateMapReader.h rename to src/ObjCompiling/Techset/StateMap/StateMapReader.h index 5e52b3da..c1bda74f 100644 --- a/src/ObjLoading/StateMap/StateMapReader.h +++ b/src/ObjCompiling/Techset/StateMap/StateMapReader.h @@ -2,9 +2,8 @@ #include "Parsing/IParserLineStream.h" #include "Parsing/StateMapParserState.h" -#include "StateMap/StateMapLayout.h" #include "StateMapDefinition.h" -#include "Utils/ClassUtils.h" +#include "Techset/StateMap/StateMapLayout.h" #include #include @@ -22,7 +21,7 @@ namespace state_map public: StateMapReader(std::istream& stream, std::string fileName, std::string stateMapName, const StateMapLayout& layout); - _NODISCARD bool IsValidEndState(const StateMapParserState* state) const; - _NODISCARD std::unique_ptr ReadStateMapDefinition() const; + [[nodiscard]] bool IsValidEndState(const StateMapParserState* state) const; + [[nodiscard]] std::unique_ptr ReadStateMapDefinition() const; }; } // namespace state_map diff --git a/src/ObjLoading/Techset/TechniqueStateMapCache.cpp b/src/ObjCompiling/Techset/StateMap/TechniqueStateMapCache.cpp similarity index 100% rename from src/ObjLoading/Techset/TechniqueStateMapCache.cpp rename to src/ObjCompiling/Techset/StateMap/TechniqueStateMapCache.cpp diff --git a/src/ObjLoading/Techset/TechniqueStateMapCache.h b/src/ObjCompiling/Techset/StateMap/TechniqueStateMapCache.h similarity index 69% rename from src/ObjLoading/Techset/TechniqueStateMapCache.h rename to src/ObjCompiling/Techset/StateMap/TechniqueStateMapCache.h index aaf8b245..be1d8af8 100644 --- a/src/ObjLoading/Techset/TechniqueStateMapCache.h +++ b/src/ObjCompiling/Techset/StateMap/TechniqueStateMapCache.h @@ -1,8 +1,7 @@ #pragma once #include "Asset/IZoneAssetCreationState.h" -#include "StateMap/StateMapDefinition.h" -#include "Utils/ClassUtils.h" +#include "Techset/StateMap/StateMapDefinition.h" #include #include @@ -13,10 +12,10 @@ namespace techset class TechniqueStateMapCache final : public IZoneAssetCreationState { public: - _NODISCARD const state_map::StateMapDefinition* GetCachedStateMap(const std::string& name) const; + [[nodiscard]] const state_map::StateMapDefinition* GetCachedStateMap(const std::string& name) const; void AddStateMapToCache(std::unique_ptr stateMap); - _NODISCARD const state_map::StateMapDefinition* GetStateMapForTechnique(const std::string& techniqueName) const; + [[nodiscard]] const state_map::StateMapDefinition* GetStateMapForTechnique(const std::string& techniqueName) const; void SetTechniqueUsesStateMap(std::string techniqueName, const state_map::StateMapDefinition* stateMap); private: diff --git a/src/ObjLoading/Techset/TechniqueDefinitionAcceptor.cpp b/src/ObjCompiling/Techset/TechniqueDefinitionAcceptor.cpp similarity index 100% rename from src/ObjLoading/Techset/TechniqueDefinitionAcceptor.cpp rename to src/ObjCompiling/Techset/TechniqueDefinitionAcceptor.cpp diff --git a/src/ObjLoading/Techset/TechniqueDefinitionAcceptor.h b/src/ObjCompiling/Techset/TechniqueDefinitionAcceptor.h similarity index 100% rename from src/ObjLoading/Techset/TechniqueDefinitionAcceptor.h rename to src/ObjCompiling/Techset/TechniqueDefinitionAcceptor.h diff --git a/src/ObjLoading/Techset/CommonTechsetCache.cpp b/src/ObjLoading/Techset/CommonTechsetCache.cpp deleted file mode 100644 index aa089e7b..00000000 --- a/src/ObjLoading/Techset/CommonTechsetCache.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "CommonTechsetCache.h" - -using namespace techset; - -CommonTechset* CommonTechsetCache::GetCachedTechsetDefinition(const std::string& techsetName) const -{ - const auto foundTechset = m_cache.find(techsetName); - - if (foundTechset != m_cache.end()) - return foundTechset->second.get(); - - return nullptr; -} - -void CommonTechsetCache::AddCommonTechsetToCache(std::string name, std::unique_ptr definition) -{ - m_cache.emplace(std::make_pair(std::move(name), std::move(definition))); -} diff --git a/src/ObjLoading/Techset/CommonTechsetCache.h b/src/ObjLoading/Techset/CommonTechsetCache.h deleted file mode 100644 index dea2a1d2..00000000 --- a/src/ObjLoading/Techset/CommonTechsetCache.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include "Asset/IZoneAssetCreationState.h" -#include "Techset/CommonTechset.h" - -#include -#include -#include - -namespace techset -{ - class CommonTechsetCache final : public IZoneAssetCreationState - { - public: - [[nodiscard]] CommonTechset* GetCachedTechsetDefinition(const std::string& techsetName) const; - void AddCommonTechsetToCache(std::string name, std::unique_ptr definition); - - private: - std::unordered_map> m_cache; - }; -} // namespace techset diff --git a/src/ObjLoading/Techset/TechniqueCache.cpp b/src/ObjLoading/Techset/TechniqueCache.cpp new file mode 100644 index 00000000..98287bc3 --- /dev/null +++ b/src/ObjLoading/Techset/TechniqueCache.cpp @@ -0,0 +1,9 @@ +#include "TechniqueCache.h" + +namespace techset +{ + void TechniqueCache::AddTechniqueToCache(std::string name, void* technique) + { + m_cache.emplace(std::move(name), technique); + } +} // namespace techset diff --git a/src/ObjLoading/Techset/TechniqueCache.h b/src/ObjLoading/Techset/TechniqueCache.h new file mode 100644 index 00000000..40858468 --- /dev/null +++ b/src/ObjLoading/Techset/TechniqueCache.h @@ -0,0 +1,28 @@ +#pragma once + +#include "Asset/IZoneAssetCreationState.h" + +#include +#include + +namespace techset +{ + class TechniqueCache final : public IZoneAssetCreationState + { + public: + template [[nodiscard]] TechniqueType* GetCachedTechnique(const std::string& techniqueName) const + { + const auto foundTechnique = m_cache.find(techniqueName); + + if (foundTechnique != m_cache.end()) + return static_cast(foundTechnique->second); + + return nullptr; + } + + void AddTechniqueToCache(std::string name, void* technique); + + private: + std::unordered_map m_cache; + }; +} // namespace techset diff --git a/src/ObjLoading/Techset/TechniqueFileReader.cpp b/src/ObjLoading/Techset/TechniqueFileReader.cpp deleted file mode 100644 index 71a40fbf..00000000 --- a/src/ObjLoading/Techset/TechniqueFileReader.cpp +++ /dev/null @@ -1,39 +0,0 @@ -#include "TechniqueFileReader.h" - -#include "Parsing/Impl/CommentRemovingStreamProxy.h" -#include "Parsing/Impl/ParserSingleInputStream.h" -#include "Parsing/Simple/SimpleLexer.h" -#include "Parsing/TechniqueFileParser.h" -#include "Utils/Logging/Log.h" - -#include - -using namespace techset; - -TechniqueFileReader::TechniqueFileReader(std::istream& stream, std::string fileName, ITechniqueDefinitionAcceptor* acceptor) - : m_file_name(std::move(fileName)), - m_acceptor(acceptor) -{ - m_base_stream = std::make_unique(stream, m_file_name); - m_comment_proxy = std::make_unique(m_base_stream.get()); -} - -bool TechniqueFileReader::ReadTechniqueDefinition() const -{ - SimpleLexer::Config lexerConfig; - lexerConfig.m_emit_new_line_tokens = false; - lexerConfig.m_read_strings = true; - lexerConfig.m_string_escape_sequences = false; - lexerConfig.m_read_integer_numbers = true; - lexerConfig.m_read_floating_point_numbers = true; - const auto lexer = std::make_unique(m_comment_proxy.get(), std::move(lexerConfig)); - - const auto parser = std::make_unique(lexer.get(), m_acceptor); - - const auto success = parser->Parse(); - if (success) - return true; - - con::error("Parsing technique file \"{}\" failed!", m_file_name); - return false; -} diff --git a/src/ObjLoading/Techset/TechniqueFileReader.h b/src/ObjLoading/Techset/TechniqueFileReader.h deleted file mode 100644 index 2090304b..00000000 --- a/src/ObjLoading/Techset/TechniqueFileReader.h +++ /dev/null @@ -1,25 +0,0 @@ -#pragma once - -#include "Parsing/IParserLineStream.h" -#include "TechniqueDefinitionAcceptor.h" -#include "Utils/ClassUtils.h" - -#include -#include - -namespace techset -{ - class TechniqueFileReader - { - public: - TechniqueFileReader(std::istream& stream, std::string fileName, ITechniqueDefinitionAcceptor* acceptor); - - [[nodiscard]] bool ReadTechniqueDefinition() const; - - private: - std::string m_file_name; - ITechniqueDefinitionAcceptor* m_acceptor; - std::unique_ptr m_base_stream; - std::unique_ptr m_comment_proxy; - }; -} // namespace techset diff --git a/src/ObjWriting/Game/T6/Techset/TechsetDumperT6.cpp b/src/ObjWriting/Game/T6/Techset/TechsetDumperT6.cpp index f9c06660..c6c6919a 100644 --- a/src/ObjWriting/Game/T6/Techset/TechsetDumperT6.cpp +++ b/src/ObjWriting/Game/T6/Techset/TechsetDumperT6.cpp @@ -281,13 +281,6 @@ namespace void DumpTechniques(AssetDumpingContext& context, const MaterialTechniqueSet& techset) { - static techset::CommonCodeSourceInfos codeSourceInfos(commonCodeConstSources, - std::extent_v, - commonCodeSamplerSources, - std::extent_v); - static techset::CommonStreamRoutingInfos routingInfos( - streamRoutingSources, std::extent_v, streamRoutingDestinations, std::extent_v); - auto* techniqueState = context.GetZoneAssetDumperState(); const auto* materialConstantState = context.GetZoneAssetDumperState(); for (const auto* technique : techset.techniques) @@ -296,7 +289,7 @@ namespace { const auto commonTechnique = ConvertToCommonTechnique(*technique); - techset::DumpCommonTechnique(context, commonTechnique, codeSourceInfos, routingInfos, *materialConstantState); + techset::DumpCommonTechnique(context, commonTechnique, commonCodeSourceInfos, commonRoutingInfos, *materialConstantState); } } }