#ifndef EGG_SYSTEM_H #define EGG_SYSTEM_H #include "common.h" #include "egg/core/eggVideo.h" struct OSBootInfo; namespace EGG { class Display; class Heap; class PerformanceView; class SceneManager; class SimpleAudioMgr; class Thread; class Video; class XfbManager; class ConfigurationData { public: inline ConfigurationData() : mSystemHeapSize(0x89000) {} // vtable at 0x0 /* vt 0x08 */ virtual Video *getVideo() = 0; /* vt 0x0C */ virtual Heap *getSystemHeap() = 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 */ void *mRoot1HeapStart; /* 0x08 */ void *mRoot1HeapEnd; /* 0x0C */ void *mRoot2HeapStart; /* 0x10 */ void *mRoot2HeapEnd; /* 0x14 */ u32 mMemSize; /* 0x18 */ Heap *mRootHeapMem1; /* 0x1C */ Heap *mRootHeapMem2; /* 0x20 */ Heap *mRootHeapDebug; /* 0x24 */ Heap *mSystemHeap; /* 0x28 */ Thread *mSystemThread; /* 0x2C */ OSBootInfo *mBootInfo; /* 0x30 */ void *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 {} void initialize() override {} Video *getVideo() override { return static_cast