diff options
| author | KiritoDv <kiritodev01@gmail.com> | 2024-03-09 23:12:39 -0600 |
|---|---|---|
| committer | Lywx <kiritodev01@gmail.com> | 2024-03-10 15:58:45 -0600 |
| commit | 5d4bd639dfdffcf26edb458485beee1b81b92531 (patch) | |
| tree | 7495a81317f88140bce0c55c7c3cc3ec7c195b58 /src/factories/DisplayListOverrides.cpp | |
| parent | c4bb1ad8ee74a2ae4659926717ed7de9ee1e0c69 (diff) | |
Refactored vtx overlap function
Diffstat (limited to 'src/factories/DisplayListOverrides.cpp')
| -rw-r--r-- | src/factories/DisplayListOverrides.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/factories/DisplayListOverrides.cpp b/src/factories/DisplayListOverrides.cpp index 52a832d..32c9b5c 100644 --- a/src/factories/DisplayListOverrides.cpp +++ b/src/factories/DisplayListOverrides.cpp @@ -10,6 +10,8 @@ namespace GFXDOverride { +std::unordered_map<uint32_t, std::tuple<std::string, YAML::Node>> mVtxOverlaps; + void Triangle2(const Gfx* gfx) { auto w0 = gfx->words.w0; auto w1 = gfx->words.w1; @@ -47,6 +49,25 @@ void Quadrangle(const Gfx* gfx) { } int Vtx(uint32_t ptr, int32_t num) { + auto vtx = GetVtxOverlap(ptr); + + if(vtx.has_value()){ + auto symbol = std::get<0>(vtx.value()); + auto node = std::get<1>(vtx.value()); + + auto offset = GetSafeNode<uint32_t>(node, "offset"); + auto count = GetSafeNode<uint32_t>(node, "count"); + auto idx = (ptr - offset) / sizeof(Vtx_t); + + SPDLOG_INFO("Replaced Vtx Overlapped: 0x{:X} Symbol: {}", ptr, symbol); + gfxd_puts("&"); + gfxd_puts(symbol.c_str()); + gfxd_puts("["); + gfxd_puts(std::to_string(idx).c_str()); + gfxd_puts("]"); + return 1; + } + auto dec = Companion::Instance->GetNodeByAddr(ptr); if(dec.has_value()){ @@ -120,4 +141,24 @@ int DisplayList(uint32_t ptr) { SPDLOG_WARN("Could not find display list to override at 0x{:X}", ptr); return 0; } + +std::optional<std::tuple<std::string, YAML::Node>> GetVtxOverlap(uint32_t ptr){ + if(mVtxOverlaps.contains(ptr)){ + SPDLOG_INFO("Found overlap for ptr 0x{:X}", ptr); + return mVtxOverlaps[ptr]; + } + + SPDLOG_INFO("Failed to find overlap for ptr 0x{:X}", ptr); + + return std::nullopt; +} + +void RegisterVTXOverlap(uint32_t ptr, std::tuple<std::string, YAML::Node>& vtx){ + mVtxOverlaps[ptr] = vtx; + SPDLOG_INFO("Register overlap for ptr 0x{:X}", ptr); +} + +void ClearVtx(){ + mVtxOverlaps.clear(); +} } |
