diff options
| author | KiritoDv <kiritodev01@gmail.com> | 2024-05-01 10:09:49 -0600 |
|---|---|---|
| committer | KiritoDv <kiritodev01@gmail.com> | 2024-05-01 10:09:49 -0600 |
| commit | a2c3feb67a2f8afb1cebd0e77e4a3e23db2c28c4 (patch) | |
| tree | 4250a53478f87b8b07e16481a634ef16550ddb43 /src/port/GBIMiddleware.cpp | |
| parent | d5264825f0a7ab67f53fca8857cbd24dd86ee86d (diff) | |
WIP Compilation
Diffstat (limited to 'src/port/GBIMiddleware.cpp')
| -rw-r--r-- | src/port/GBIMiddleware.cpp | 54 |
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); +} |
