From 7d80ff670d58df723eae282ff1ef4c851c03b915 Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 14 Apr 2022 20:11:51 +0200 Subject: [PATCH] Convert technique passes --- .../AssetLoaders/AssetLoaderTechniqueSet.cpp | 57 +++++++++++++++---- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderTechniqueSet.cpp b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderTechniqueSet.cpp index a1ce9b9f..8188cd68 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderTechniqueSet.cpp +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderTechniqueSet.cpp @@ -151,7 +151,7 @@ namespace IW4 argument.dest = static_cast(shaderArgument.m_register_index + registerOffset); unsigned arrayCount; - const std::vector accessors({ shaderArgument.m_name }); + const std::vector accessors({shaderArgument.m_name}); if (isSamplerArgument) { const CodeSamplerSource* samplerSource = FindCodeSamplerSource(accessors, s_codeSamplers); @@ -505,7 +505,7 @@ namespace IW4 } static bool SetArgumentCodeSampler(MaterialShaderArgument& argument, const techset::ShaderArgumentCodeSource& source, const d3d9::ShaderConstant& shaderConstant, const unsigned sourceIndex, - const unsigned arrayCount, std::string& errorMessage) + const unsigned arrayCount, std::string& errorMessage) { if (arrayCount > 0u) { @@ -859,16 +859,53 @@ namespace IW4 return ss.str(); } - void ConvertPass(MaterialPass& out, const TechniqueCreator::Pass& in) + void ConvertPass(MaterialPass& out, const TechniqueCreator::Pass& in, std::vector& dependencies) const { + out.customSamplerFlags = 0u; out.vertexShader = in.m_vertex_shader->Asset(); out.pixelShader = in.m_pixel_shader->Asset(); + out.vertexDecl = in.m_vertex_decl_asset->Asset(); + + size_t perObjArgCount = 0u; + size_t perPrimArgCount = 0u; + size_t stableArgCount = 0u; + for(const auto& arg : in.m_arguments) + { + if(arg.type == MTL_ARG_MATERIAL_VERTEX_CONST + || arg.type == MTL_ARG_MATERIAL_PIXEL_CONST + || arg.type == MTL_ARG_MATERIAL_PIXEL_SAMPLER) + { + perObjArgCount++; + } + else if(arg.type >= MTL_ARG_CODE_PRIM_BEGIN && arg.type < MTL_ARG_CODE_PRIM_END) + { + perPrimArgCount++; + } + else + { + stableArgCount++; + } + } + + out.perObjArgCount = static_cast(perObjArgCount); + out.perPrimArgCount = static_cast(perPrimArgCount); + out.stableArgCount = static_cast(stableArgCount); + + const auto dataSize = sizeof(MaterialShaderArgument) * in.m_arguments.size(); + out.args = static_cast(m_memory->Alloc(dataSize)); + memcpy(out.args, in.m_arguments.data(), dataSize); + + if(in.m_vertex_shader) + dependencies.push_back(in.m_vertex_shader); + if(in.m_pixel_shader) + dependencies.push_back(in.m_pixel_shader); + if(in.m_vertex_decl_asset) + dependencies.push_back(in.m_vertex_decl_asset); } - MaterialTechnique* ConvertTechnique(const std::string& techniqueName, const std::vector& passes) + MaterialTechnique* ConvertTechnique(const std::string& techniqueName, const std::vector& passes, std::vector& dependencies) const { assert(!passes.empty()); - // TODO: Load technique or use previously loaded one const auto techniqueSize = sizeof(MaterialTechnique) + (passes.size() - 1u) * sizeof(MaterialPass); auto* technique = static_cast(m_memory->Alloc(techniqueSize)); memset(technique, 0, techniqueSize); @@ -876,12 +913,12 @@ namespace IW4 technique->passCount = static_cast(passes.size()); for (auto i = 0u; i < passes.size(); i++) - ConvertPass(technique->passArray[i], passes.at(i)); + ConvertPass(technique->passArray[i], passes.at(i), dependencies); return technique; } - MaterialTechnique* LoadTechniqueFromRaw(const std::string& techniqueName, std::vector& dependencies) + MaterialTechnique* LoadTechniqueFromRaw(const std::string& techniqueName, std::vector& dependencies) const { const auto techniqueFileName = GetTechniqueFileName(techniqueName); const auto file = m_search_path->Open(techniqueFileName); @@ -893,7 +930,7 @@ namespace IW4 if (!reader.ReadTechniqueDefinition()) return nullptr; - return ConvertTechnique(techniqueName, creator.m_passes); + return ConvertTechnique(techniqueName, creator.m_passes, dependencies); } public: @@ -905,7 +942,7 @@ namespace IW4 { } - const LoadedTechnique* LoadMaterialTechnique(const std::string& techniqueName) + _NODISCARD const LoadedTechnique* LoadMaterialTechnique(const std::string& techniqueName) const { auto* technique = m_zone_state->FindLoadedTechnique(techniqueName); if (technique) @@ -943,7 +980,7 @@ bool AssetLoaderTechniqueSet::CreateTechsetFromDefinition(const std::string& ass memset(techset, 0, sizeof(MaterialTechniqueSet)); techset->name = memory->Dup(assetName.c_str()); - TechniqueLoader techniqueLoader(searchPath, memory, manager); + const TechniqueLoader techniqueLoader(searchPath, memory, manager); std::set dependencies; for (auto i = 0u; i < std::extent_v; i++) {