From 25244bc3b0367b8e57ce4d4937160f6772026cbd Mon Sep 17 00:00:00 2001 From: Jan Date: Wed, 23 Mar 2022 14:42:17 +0100 Subject: [PATCH] Dump IW4 techset files --- src/ObjCommon/Game/IW4/TechsetConstantsIW4.h | 62 +++++++++++++++++++ .../AssetDumpers/AssetDumperTechniqueSet.cpp | 53 +++++++++++++++- 2 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 src/ObjCommon/Game/IW4/TechsetConstantsIW4.h diff --git a/src/ObjCommon/Game/IW4/TechsetConstantsIW4.h b/src/ObjCommon/Game/IW4/TechsetConstantsIW4.h new file mode 100644 index 00000000..d30bf5aa --- /dev/null +++ b/src/ObjCommon/Game/IW4/TechsetConstantsIW4.h @@ -0,0 +1,62 @@ +#pragma once + +#include + +#include "Game/IW4/IW4.h" + +namespace IW4 +{ + inline const char* techniqueTypeNames[] + { + "depth prepass", + "build floatz", + "build shadowmap depth", + "build shadowmap color", + "unlit", + "emissive", + "emissive dfog", + "emissive shadow", + "emissive shadow dfog", + "lit", + "lit dfog", + "lit sun", + "lit sun dfog", + "lit sun shadow", + "lit sun shadow dfog", + "lit spot", + "lit spot dfog", + "lit spot shadow", + "lit spot shadow dfog", + "lit omni", + "lit omni dfog", + "lit omni shadow", + "lit omni shadow dfog", + "lit instanced", + "lit instanced dfog", + "lit instanced sun", + "lit instanced sun dfog", + "lit instanced sun shadow", + "lit instanced sun shadow dfog", + "lit instanced spot", + "lit instanced spot dfog", + "lit instanced spot shadow", + "lit instanced spot shadow dfog", + "lit instanced omni", + "lit instanced omni dfog", + "lit instanced omni shadow", + "lit instanced omni shadow dfog", + "light spot", + "light omni", + "light spot shadow", + "fakelight normal", + "fakelight view", + "sunlight preview", + "case texture", + "solid wireframe", + "shaded wireframe", + "debug bumpmap", + "debug bumpmap instanced", + }; + + static_assert(std::extent_v == TECHNIQUE_COUNT); +} \ No newline at end of file diff --git a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperTechniqueSet.cpp b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperTechniqueSet.cpp index e27eb755..d8bcd53a 100644 --- a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperTechniqueSet.cpp +++ b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperTechniqueSet.cpp @@ -1,8 +1,11 @@ #include "AssetDumperTechniqueSet.h" +#include #include +#include #include "Dumping/AbstractTextDumper.h" +#include "Game/IW4/TechsetConstantsIW4.h" using namespace IW4; @@ -39,15 +42,61 @@ namespace IW4 class TechsetFileWriter : public AbstractTextDumper { + bool m_last_write_was_value; + public: explicit TechsetFileWriter(std::ostream& stream) - : AbstractTextDumper(stream) + : AbstractTextDumper(stream), + m_last_write_was_value(false) { } + void WriteTechniqueType(const size_t techniqueIndex) + { + assert(techniqueIndex < std::extent_v); + + if(m_last_write_was_value) + { + m_stream << "\n"; + m_last_write_was_value = false; + } + m_stream << '"' << techniqueTypeNames[techniqueIndex] << "\":\n"; + } + + void WriteTechniqueValue(const char* value) + { + m_last_write_was_value = true; + + IncIndent(); + Indent(); + m_stream << value << ";\n"; + DecIndent(); + } + void DumpTechset(const MaterialTechniqueSet* techset) { - m_stream << "techset lol"; + std::vector dumpedTechniques(std::extent_v); + + for(auto techniqueIndex = 0u; techniqueIndex < std::extent_v; techniqueIndex++) + { + const auto* technique = techset->techniques[techniqueIndex]; + if(technique == nullptr || dumpedTechniques[techniqueIndex]) + continue; + + dumpedTechniques[techniqueIndex] = true; + WriteTechniqueType(techniqueIndex); + + for(auto nextTechniqueIndex = techniqueIndex + 1; nextTechniqueIndex < std::extent_v; nextTechniqueIndex++) + { + if(techset->techniques[nextTechniqueIndex] != technique) + continue; + + dumpedTechniques[nextTechniqueIndex] = true; + WriteTechniqueType(nextTechniqueIndex); + } + + WriteTechniqueValue(technique->name); + } } }; }