summaryrefslogtreecommitdiff
path: root/src/factories/DisplayListOverrides.cpp
diff options
context:
space:
mode:
authorKiritoDv <kiritodev01@gmail.com>2024-03-09 23:12:39 -0600
committerLywx <kiritodev01@gmail.com>2024-03-10 15:58:45 -0600
commit5d4bd639dfdffcf26edb458485beee1b81b92531 (patch)
tree7495a81317f88140bce0c55c7c3cc3ec7c195b58 /src/factories/DisplayListOverrides.cpp
parentc4bb1ad8ee74a2ae4659926717ed7de9ee1e0c69 (diff)
Refactored vtx overlap function
Diffstat (limited to 'src/factories/DisplayListOverrides.cpp')
-rw-r--r--src/factories/DisplayListOverrides.cpp41
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();
+}
}