From 22f246c2522f3233015af43a66c6e5599f5f84af Mon Sep 17 00:00:00 2001 From: KiritoDv Date: Wed, 23 Oct 2024 09:43:46 -0600 Subject: Added support for tables on display lists --- src/factories/DisplayListFactory.cpp | 59 ++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 9 deletions(-) (limited to 'src/factories/DisplayListFactory.cpp') diff --git a/src/factories/DisplayListFactory.cpp b/src/factories/DisplayListFactory.cpp index c7333e5..0111313 100644 --- a/src/factories/DisplayListFactory.cpp +++ b/src/factories/DisplayListFactory.cpp @@ -90,10 +90,17 @@ ExportResult DListHeaderExporter::Export(std::ostream &write, std::shared_ptr raw, std::string& entryName, YAML::Node &node, std::string* replacement ) { const auto cmds = std::static_pointer_cast(raw)->mGfxs; const auto symbol = GetSafeNode(node, "symbol", entryName); auto offset = GetSafeNode(node, "offset"); + const auto searchTable = Companion::Instance->SearchTable(offset); + const auto sz = (sizeof(uint32_t) * cmds.size()); + hasTable = searchTable.has_value(); + + size_t isize = cmds.size(); char out[0xFFFF] = {0}; @@ -105,7 +112,11 @@ ExportResult DListCodeExporter::Export(std::ostream &write, std::shared_ptr(gfxd_macro_data()); const uint8_t opcode = (gfx->words.w0 >> 24) & 0xFF; - gfxd_puts(fourSpaceTab); + if(hasTable) { + gfxd_puts(fourSpaceTab fourSpaceTab); + } else { + gfxd_puts(fourSpaceTab); + } // For mk64 only if(opcode == GBI(G_QUAD) && Companion::Instance->GetGBIMinorVersion() == GBIMinorVersion::Mk64) { @@ -130,17 +141,47 @@ ExportResult DListCodeExporter::Export(std::ostream &write, std::shared_ptr -1) { + isize = index_size; + } - if (Companion::Instance->IsDebug()) { - write << "// count: " << std::to_string(sz / 8) << " Gfx\n"; + if(start == offset){ + gfxd_puts(("Gfx " + name + "[][" + std::to_string(isize / 2) + "] = {\n").c_str()); + gfxd_puts("\t{\n"); + } else { + gfxd_puts("\t{\n"); + } + gfxd_execute(); + write << std::string(out); + if(end == offset){ + write << tab_t << "}\n"; + write << "};\n"; + if (Companion::Instance->IsDebug()) { + write << "// count: " << std::to_string(sz / 8) << " Gfx\n"; + }else { + write << "\n"; + } + } else { + write << tab_t << "},\n"; + } } else { - write << "\n"; + gfxd_puts(("Gfx " + symbol + "[] = {\n").c_str()); + gfxd_execute(); + write << std::string(out); + write << "};\n"; + + if (Companion::Instance->IsDebug()) { + write << "// count: " << std::to_string(sz / 8) << " Gfx\n"; + } else { + write << "\n"; + } } return offset + sz; -- cgit v1.2.3