diff --git a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperTechniqueSet.cpp b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperTechniqueSet.cpp index dab973a6..5797402c 100644 --- a/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperTechniqueSet.cpp +++ b/src/ObjWriting/Game/IW4/AssetDumpers/AssetDumperTechniqueSet.cpp @@ -383,15 +383,36 @@ namespace IW4 void DumpVertexDecl(const MaterialPass& pass) { - if (pass.vertexDecl == nullptr || pass.vertexDecl->streamCount <= 0) + const auto* vertexDecl = pass.vertexDecl; + if (vertexDecl == nullptr) return; + if(vertexDecl->name && vertexDecl->name[0] == ',') + { + const auto loadedVertexDeclFromOtherZone = GlobalAssetPool::GetAssetByName(&vertexDecl->name[1]); + + if (loadedVertexDeclFromOtherZone == nullptr) + { + // Cannot dump when shader is referenced due to unknown constant names and unknown version + Indent(); + std::cerr << "Cannot dump vertex decl " << &vertexDecl->name[1] << " due to being a referenced asset\n"; + m_stream << "// Cannot dump vertex decl " << &vertexDecl->name[1] << " due to being a referenced asset\n"; + return; + } + vertexDecl = loadedVertexDeclFromOtherZone->Asset(); + } + m_stream << "\n"; - const auto streamCount = std::min(static_cast(pass.vertexDecl->streamCount), std::extent_v); +#ifdef TECHSET_DEBUG + Indent(); + m_stream << "// Decl: " << vertexDecl->name << "\n"; +#endif + + const auto streamCount = std::min(static_cast(vertexDecl->streamCount), std::extent_v); for (auto streamIndex = 0u; streamIndex < streamCount; streamIndex++) { - const auto& stream = pass.vertexDecl->routing.data[streamIndex]; + const auto& stream = vertexDecl->routing.data[streamIndex]; Indent(); m_stream << "vertex." << GetStreamDestinationString(static_cast(stream.dest)) << " = code." << GetStreamSourceString(static_cast(stream.source)) << ";\n";