#ifndef EGG_SYSTEM_H #define EGG_SYSTEM_H #include "common.h" #include "egg/core/eggController.h" #include "egg/core/eggDisplay.h" #include "egg/core/eggDvdFile.h" #include "egg/core/eggGraphicsFifo.h" #include "egg/core/eggHeap.h" #include "egg/core/eggVideo.h" #include "egg/core/eggXfbManager.h" #include "rvl/WPAD.h" #include "toBeSorted/d_exception.h" namespace { // TODO Determine better names (+ location?) for this render mode set const GXRenderModeObj gRMO_Unk1 = { 0, // tvInfo 608, // fbWidth 456, // efbHeight 456, // xfbHeight 25, // viXOrigin 12, // viYOrigin 670, // viWidth 456, // viHeight 1, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const GXRenderModeObj gRMO_Unk2 = { 2, // tvInfo 608, // fbWidth 456, // efbHeight 456, // xfbHeight 25, // viXOrigin 12, // viYOrigin 670, // viWidth 456, // viHeight 0, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const GXRenderModeObj gRMO_Unk3 = { 4, // tvInfo 608, // fbWidth 456, // efbHeight 542, // xfbHeight 27, // viXOrigin 16, // viYOrigin 666, // viWidth 542, // viHeight 1, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const GXRenderModeObj gRMO_Unk4 = { 20, // tvInfo 608, // fbWidth 456, // efbHeight 456, // xfbHeight 25, // viXOrigin 12, // viYOrigin 670, // viWidth 456, // viHeight 1, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const GXRenderModeObj gRMO_Unk5 = { 22, // tvInfo 608, // fbWidth 456, // efbHeight 456, // xfbHeight 25, // viXOrigin 12, // viYOrigin 670, // viWidth 456, // viHeight 0, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const GXRenderModeObj gRMO_Unk6 = { 0, // tvInfo 608, // fbWidth 456, // efbHeight 456, // xfbHeight 17, // viXOrigin 12, // viYOrigin 686, // viWidth 456, // viHeight 1, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const GXRenderModeObj gRMO_Unk7 = { 2, // tvInfo 608, // fbWidth 456, // efbHeight 456, // xfbHeight 17, // viXOrigin 12, // viYOrigin 686, // viWidth 456, // viHeight 0, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const GXRenderModeObj gRMO_Unk8 = { 4, // tvInfo 608, // fbWidth 456, // efbHeight 542, // xfbHeight 19, // viXOrigin 16, // viYOrigin 682, // viWidth 542, // viHeight 1, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const GXRenderModeObj gRMO_Unk9 = { 20, // tvInfo 608, // fbWidth 456, // efbHeight 456, // xfbHeight 17, // viXOrigin 12, // viYOrigin 686, // viWidth 456, // viHeight 1, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const GXRenderModeObj gRMO_Unk10 = { 22, // tvInfo 608, // fbWidth 456, // efbHeight 456, // xfbHeight 17, // viXOrigin 12, // viYOrigin 686, // viWidth 456, // viHeight 0, // xfbMode 0, // field_rendering 0, // aa { {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, {6, 6}, }, // sample_pattern {0, 0, 21, 22, 21, 0, 0} // vFilter }; const EGG::Video::RenderModeObjSet gUnkRenderModeObjSet = { {&gRMO_Unk1, &gRMO_Unk2, &gRMO_Unk3, &gRMO_Unk4, &gRMO_Unk5, &gRMO_Unk6, &gRMO_Unk7, &gRMO_Unk8, &gRMO_Unk9, &gRMO_Unk10} }; } namespace EGG { // TODO Proper definition of PerformanceView class PerformanceView { public: u8 placeholder[0x4c]; /* 0x4c */ u32 _4c; }; class SceneManager; class SimpleAudioMgr; class ConfigurationData { public: inline ConfigurationData() : mSystemHeapSize(0x89000) {} // vtable at 0x0 /* vt 0x08 */ virtual Video *getVideo() = 0; /* vt 0x0C */ virtual Heap *getSysHeap() = 0; /* vt 0x10 */ virtual Display *getDisplay() = 0; /* vt 0x14 */ virtual XfbManager *getXfbMgr() = 0; /* vt 0x18 */ virtual PerformanceView *getPerfView() = 0; /* vt 0x1C */ virtual SceneManager *getSceneMgr() = 0; /* vt 0x20 */ virtual SimpleAudioMgr *getAudioMgr() = 0; /* vt 0x24 */ virtual void onBeginFrame(); /* vt 0x28 */ virtual void onEndFrame(); /* vt 0x2C */ virtual void initRenderMode(); /* vt 0x30 */ virtual void initMemory(); /* vt 0x34 */ virtual void run(); /* vt 0x38 */ virtual void initialize() = 0; public: /* 0x04 */ u32 mRoot1HeapStart; /* 0x08 */ u32 mRoot1HeapEnd; /* 0x0C */ u32 mRoot2HeapStart; /* 0x10 */ u32 mRoot2HeapEnd; /* 0x14 */ u32 mMemSize; /* 0x18 */ Heap *mRootHeapMem1; /* 0x1C */ Heap *mRootHeapMem2; /* 0x20 */ Heap *mRootHeapDebug; /* 0x24 */ Heap *mSystemHeap; /* 0x28 */ Thread *mSystemThread; /* 0x2C */ u32 field_0x2C; /* 0x30 */ u32 mSystemHeapStart; /* 0x34 */ u32 mSystemHeapSize; }; class BaseSystem { public: static ConfigurationData *mConfigData; static XfbManager *getXfbMgr() { return mConfigData->getXfbMgr(); } static Display *getDisplay() { return mConfigData->getDisplay(); } static Video *getVideo() { return mConfigData->getVideo(); } }; template class TSystem : public ConfigurationData { public: inline TSystem() : mGraphicsFifoSize(0x80000), mRenderMode() {} void onBeginFrame() override {} void onEndFrame() override {} void initRenderMode() override {} Video *getVideo() override { return static_cast