summaryrefslogtreecommitdiff
path: root/src/port/GBIMiddleware.cpp
diff options
context:
space:
mode:
authorKiritoDv <kiritodev01@gmail.com>2024-05-01 10:09:49 -0600
committerKiritoDv <kiritodev01@gmail.com>2024-05-01 10:09:49 -0600
commita2c3feb67a2f8afb1cebd0e77e4a3e23db2c28c4 (patch)
tree4250a53478f87b8b07e16481a634ef16550ddb43 /src/port/GBIMiddleware.cpp
parentd5264825f0a7ab67f53fca8857cbd24dd86ee86d (diff)
WIP Compilation
Diffstat (limited to 'src/port/GBIMiddleware.cpp')
-rw-r--r--src/port/GBIMiddleware.cpp54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/port/GBIMiddleware.cpp b/src/port/GBIMiddleware.cpp
new file mode 100644
index 000000000..37b86004a
--- /dev/null
+++ b/src/port/GBIMiddleware.cpp
@@ -0,0 +1,54 @@
+#include <libultraship.h>
+
+#include "Engine.h"
+#include "DisplayList.h"
+#include "Array.h"
+
+extern "C" int GameEngine_OTRSigCheck(const char* data);
+
+extern "C" void gSPDisplayList(Gfx* pkt, Gfx* dl) {
+ char* imgData = (char*)dl;
+
+ if (GameEngine_OTRSigCheck(imgData) == 1) {
+ auto resource = LUS::Context::GetInstance()->GetResourceManager()->LoadResource(imgData);
+ auto res = std::static_pointer_cast<LUS::DisplayList>(resource);
+ dl = &res->Instructions[0];
+ dl->words.trace.file = imgData;
+ dl->words.trace.idx = 0;
+ dl->words.trace.valid = true;
+ }
+
+ __gSPDisplayList(pkt, dl);
+}
+
+extern "C" void gSPVertex(Gfx* pkt, uintptr_t v, int n, int v0) {
+
+ if (GameEngine_OTRSigCheck((char*)v) == 1) {
+ v = (uintptr_t) ResourceGetDataByName((char *) v);
+ }
+
+ __gSPVertex(pkt, v, n, v0);
+}
+
+extern "C" void gSPInvalidateTexCache(Gfx* pkt, uintptr_t texAddr) {
+ auto data = reinterpret_cast<char*>(texAddr);
+
+ if (texAddr != 0 && GameEngine_OTRSigCheck(data)) {
+ const auto res = LUS::Context::GetInstance()->GetResourceManager()->LoadResource(data);
+ const auto type = static_cast<LUS::ResourceType>(res->GetInitData()->Type);
+
+ switch(type) {
+ case LUS::ResourceType::DisplayList:
+ texAddr = reinterpret_cast<uintptr_t>(&std::static_pointer_cast<LUS::DisplayList>(res)->Instructions[0]);
+ break;
+ case LUS::ResourceType::Array:
+ texAddr = reinterpret_cast<uintptr_t>(std::static_pointer_cast<LUS::Array>(res)->Vertices.data());
+ break;
+ default:
+ texAddr = reinterpret_cast<uintptr_t>(res->GetRawPointer());
+ break;
+ }
+ }
+
+ __gSPInvalidateTexCache(pkt, texAddr);
+}