summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMegaMech <MegaMech@users.noreply.github.com>2024-06-10 22:03:09 -0600
committerGitHub <noreply@github.com>2024-06-10 22:03:09 -0600
commitfe1ce26c02e615d6ecf2a761003ace76c6fdbd96 (patch)
treea6d998a09a145198c45381fe3590fc5db4eb96c9
parent2929503ee3445e596e722c404f143e777e6498c9 (diff)
Add option to process DLs with indexes instead of offsets (#131)
* Update DisplayListFactory.cpp * Update gbi-otr.h * Update gbi-otr.h * Update DisplayListFactory.cpp * Update gbi-otr.h * Update DisplayListFactory.cpp * Update gbi-otr.h * Update gbi-otr.h * Update DisplayListFactory.cpp * Update gbi-otr.h * Update DisplayListFactory.cpp
-rw-r--r--src/factories/DisplayListFactory.cpp20
-rw-r--r--src/n64/gbi-otr.h8
2 files changed, 25 insertions, 3 deletions
diff --git a/src/factories/DisplayListFactory.cpp b/src/factories/DisplayListFactory.cpp
index dfc3fb8..5fc8902 100644
--- a/src/factories/DisplayListFactory.cpp
+++ b/src/factories/DisplayListFactory.cpp
@@ -296,9 +296,23 @@ ExportResult DListBinaryExporter::Export(std::ostream &write, std::shared_ptr<IP
auto dec = Companion::Instance->GetNodeByAddr(ptr);
auto branch = (w0 >> 16) & G_DL_NO_PUSH;
- value = gsSPDisplayListOTRHash(ptr);
- w0 = value.words.w0;
- w1 = value.words.w1;
+ Gfx value;
+ if (node["otr_mode"]) {
+ auto str = node["otr_mode"].as<std::string>();
+ // Too lower case
+ std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c){ return std::tolower(c); });
+ if (str == "index") {
+ value = gsSPDisplayListOTRIndex(w1);
+ } else {
+ value = gsSPDisplayListOTRHash(ptr);
+ }
+ w0 = value.words.w0;
+ w1 = value.words.w1;
+ } else {
+ value = gsSPDisplayListOTRHash(ptr);
+ w0 = value.words.w0;
+ w1 = value.words.w1;
+ }
writer.Write(w0);
writer.Write(w1);
diff --git a/src/n64/gbi-otr.h b/src/n64/gbi-otr.h
index 0ee659c..a5bb09e 100644
--- a/src/n64/gbi-otr.h
+++ b/src/n64/gbi-otr.h
@@ -19,6 +19,7 @@
#define G_MTX_OTR 0x36
#define G_TEXRECT_WIDE 0x37
#define G_FILLWIDERECT 0x38
+#define G_DL_OTR_INDEX 0x3D
#define G_MOVEMEM_OTR_HASH 0x42
// DL FLAGS
@@ -162,6 +163,13 @@ _DW({
(uintptr_t)(dl) \
}}
+#define gsSPDisplayListOTRIndex(dl) \
+ {{ \
+ (_SHIFTL((G_DL_OTR_INDEX), 24, 8) | _SHIFTL((0x00), 16, 8) | \
+ _SHIFTL((0), 0, 16)), \
+ (uintptr_t)((SEGMENT_NUMBER(dl) << 24) | ((SEGMENT_OFFSET(dl) / 8) & 0x00FFFFFF)) \
+ }}
+
#define gsSPDisplayListOTRFilePath(dl) \
{{ \
(_SHIFTL((G_DL_OTR_FILEPATH), 24, 8) | _SHIFTL((0x00), 16, 8) | \