From cb45bdaadce76af1c344c311ed2ef8e968dc11dd Mon Sep 17 00:00:00 2001 From: Jan Date: Sat, 16 Apr 2022 15:41:45 +0200 Subject: [PATCH] Progress on reversing technique flags --- src/Common/Game/IW4/IW4_Assets.h | 27 +++++++++++++++++++ .../AssetLoaders/AssetLoaderTechniqueSet.cpp | 17 ++++++++++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/Common/Game/IW4/IW4_Assets.h b/src/Common/Game/IW4/IW4_Assets.h index 75f4c755..1f8bc360 100644 --- a/src/Common/Game/IW4/IW4_Assets.h +++ b/src/Common/Game/IW4/IW4_Assets.h @@ -968,6 +968,18 @@ namespace IW4 int arrayStride; }; + enum + { + MTL_TYPE_DEFAULT = 0x0, + MTL_TYPE_MODEL = 0x1, // m_ + MTL_TYPE_MODEL_VERTCOL = 0x2, // mc_ + MTL_TYPE_MODEL_VERTCOL_GREY = 0x3, // ? + MTL_TYPE_WORLD = 0x4, // w_ + MTL_TYPE_WORLD_VERTCOL = 0x5, // wc_ + + MTL_TYPE_COUNT, + }; + enum MaterialConstantSource { CONST_SRC_CODE_MAYBE_DIRTY_PS_BEGIN = 0x0, @@ -1202,6 +1214,21 @@ namespace IW4 MaterialShaderArgument* args; }; + enum TechniqueFlags + { + // Guesses purely based on data analysis: + TECHNIQUE_FLAG_1 = 0x1, // uses resolvedPostSun code sampler + TECHNIQUE_FLAG_2 = 0x2, // uses resolvedScene code sampler + TECHNIQUE_FLAG_4 = 0x4, // zprepass only + TECHNIQUE_FLAG_8 = 0x8, // build_floatz only + TECHNIQUE_FLAG_10 = 0x10, // build_shadowmap_depth + build_shadowmap_model only + TECHNIQUE_FLAG_20 = 0x20, // techniques with _i_ in its name (all use texcoord[1] in decl -> other optional stream sources are not used at all so might be any optional) + TECHNIQUE_FLAG_40 = 0x40, // uses code constant light.spotDir or light.spotFactors + TECHNIQUE_FLAG_80 = 0x80, // uses floatZ sampler and does not have 0x100 flag + TECHNIQUE_FLAG_100 = 0x100, // distortion_scale_zfeather_dtex + distortion_scale_ua_zfeather + TECHNIQUE_FLAG_200 = 0x200, // ? + }; + struct MaterialTechnique { const char* name; diff --git a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderTechniqueSet.cpp b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderTechniqueSet.cpp index 3f99238a..86767813 100644 --- a/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderTechniqueSet.cpp +++ b/src/ObjLoading/Game/IW4/AssetLoaders/AssetLoaderTechniqueSet.cpp @@ -20,6 +20,7 @@ #include "Utils/Alignment.h" using namespace IW4; +using namespace std::string_literals; namespace IW4 { @@ -992,6 +993,13 @@ namespace IW4 return ss.str(); } + static void UpdateTechniqueFlags(MaterialTechnique& technique) + { + // This is stupid but that's what the game does + if("zprepass"s == technique.name) + technique.flags |= 4u; + } + static void UpdateTechniqueFlagsForArgument(uint16_t& techniqueFlags, const TechniqueCreator::PassShaderArgument& arg) { if(arg.m_arg.type == MTL_ARG_CODE_PIXEL_SAMPLER) @@ -999,10 +1007,10 @@ namespace IW4 switch(arg.m_arg.u.codeSampler) { case TEXTURE_SRC_CODE_RESOLVED_POST_SUN: - techniqueFlags |= 1u; + techniqueFlags |= TECHNIQUE_FLAG_1; break; case TEXTURE_SRC_CODE_RESOLVED_SCENE: - techniqueFlags |= 2u; + techniqueFlags |= TECHNIQUE_FLAG_2; break; default: break; @@ -1065,6 +1073,8 @@ namespace IW4 out.perPrimArgCount = static_cast(perPrimArgCount); out.stableArgCount = static_cast(stableArgCount); + UpdateTechniqueFlags(technique); + if (in.m_vertex_shader) dependencies.push_back(in.m_vertex_shader); if (in.m_pixel_shader) @@ -1170,6 +1180,9 @@ bool AssetLoaderTechniqueSet::CreateTechsetFromDefinition(const std::string& ass } } + const auto* disAsset = GlobalAssetPool::GetAssetByName("distortion_scale"); + const auto* dis = disAsset ? disAsset->Asset() : nullptr; + manager->AddAsset(ASSET_TYPE_TECHNIQUE_SET, assetName, techset, std::vector(dependencies.begin(), dependencies.end()), std::vector()); return true;