diff --git a/agsimgui/AgsImGuiStyle.cpp b/agsimgui/AgsImGuiStyle.cpp index 810be72..343584e 100644 --- a/agsimgui/AgsImGuiStyle.cpp +++ b/agsimgui/AgsImGuiStyle.cpp @@ -248,6 +248,7 @@ void AgsImGuiStyleReader::Unserialize(int key, const char* serializedData, int d agsImGuiStyle->Colors[i] = _Colors[i]; } + agsImGuiStyle->id = key; engine->RegisterUnserializedObject(key, agsImGuiStyle, &AgsImGuiStyle_Interface); } diff --git a/agsimgui/agsimgui.cpp b/agsimgui/agsimgui.cpp index 5b53663..0e3a407 100644 --- a/agsimgui/agsimgui.cpp +++ b/agsimgui/agsimgui.cpp @@ -83,6 +83,10 @@ namespace agsimgui { } #endif +const unsigned int Magic = 0xCAFE0000; +const unsigned int Version = 3; +const unsigned int SaveMagic = Magic + Version; + //define engine IAGSEngine *engine; @@ -2686,6 +2690,8 @@ int AgsImGuiHelper_GetClipboarImage() { engine->RequestEventHook(AGSE_KEYPRESS); engine->RequestEventHook(AGSE_POSTSCREENDRAW); engine->RequestEventHook(AGSE_MOUSECLICK); + engine->RequestEventHook(AGSE_SAVEGAME); + engine->RequestEventHook(AGSE_RESTOREGAME); } //------------------------------------------------------------------------------ @@ -2708,6 +2714,247 @@ int AgsImGuiHelper_GetClipboarImage() { //------------------------------------------------------------------------------ +static size_t engineFileRead(void * ptr, size_t size, size_t count, long fileHandle) { + auto totalBytes = engine->FRead(ptr, size*count, fileHandle); + return totalBytes/size; +} + +static size_t engineFileWrite(const void *ptr, size_t size, size_t count, long fileHandle) { + auto totalBytes = engine->FWrite(const_cast(ptr), size*count, fileHandle); + return totalBytes/size; +} + +void EngineReadFloat(float &f, long fileHandle){ + engine->FRead(&f, sizeof(float), fileHandle); +} + +void EngineWriteFloat(float &f, long fileHandle){ + engine->FWrite(&f, sizeof(float), fileHandle); +} + +void EngineReadInt(int &i, long fileHandle){ + engine->FRead(&i, sizeof(int), fileHandle); +} + +void EngineWriteInt(int &i, long fileHandle){ + engine->FWrite(&i, sizeof(int), fileHandle); +} + +void EngineReadBool(bool &b, long fileHandle){ + engine->FRead(&b, sizeof(bool), fileHandle); +} + +void EngineWriteBool(bool &b, long fileHandle){ + engine->FWrite(&b, sizeof(bool), fileHandle); +} + +void EngineReadImVec2(ImVec2 &imVec2, long fileHandle){ + EngineReadFloat(imVec2.x, fileHandle); + EngineReadFloat(imVec2.y, fileHandle); +} + +void EngineWriteImVec2(ImVec2 &imVec2, long fileHandle){ + EngineWriteFloat(imVec2.x, fileHandle); + EngineWriteFloat(imVec2.y, fileHandle); +} + +void EngineReadImVec4(ImVec4 &imVec4, long fileHandle){ + EngineReadFloat(imVec4.x, fileHandle); + EngineReadFloat(imVec4.y, fileHandle); + EngineReadFloat(imVec4.z, fileHandle); + EngineReadFloat(imVec4.w, fileHandle); +} + +void EngineWriteImVec4(ImVec4 &imVec4, long fileHandle){ + EngineWriteFloat(imVec4.x, fileHandle); + EngineWriteFloat(imVec4.y, fileHandle); + EngineWriteFloat(imVec4.z, fileHandle); + EngineWriteFloat(imVec4.w, fileHandle); +} + + +void RestoreGame(long fileHandle) +{ + unsigned int SaveVersion = 0; + engineFileRead(&SaveVersion, sizeof(SaveVersion), 1, fileHandle); + + if (SaveVersion != SaveMagic) { + engine->AbortGame("agsimgui: bad save."); + } + + ImGuiStyle &imGuiStyle = ImGui::GetStyle(); + + float _Alpha; + ImVec2 _WindowPadding; + float _WindowRounding; + float _WindowBorderSize; + ImVec2 _WindowMinSize; + ImVec2 _WindowTitleAlign; + int _WindowMenuButtonPosition; + float _ChildRounding; + float _ChildBorderSize; + float _PopupRounding; + float _PopupBorderSize; + ImVec2 _FramePadding; + float _FrameRounding; + float _FrameBorderSize; + ImVec2 _ItemSpacing; + ImVec2 _ItemInnerSpacing; + ImVec2 _TouchExtraPadding; + float _IndentSpacing; + float _ColumnsMinSpacing; + float _ScrollbarSize; + float _ScrollbarRounding; + float _GrabMinSize; + float _GrabRounding; + float _TabRounding; + float _TabBorderSize; + float _TabMinWidthForUnselectedCloseButton; + int _ColorButtonPosition; + ImVec2 _ButtonTextAlign; + ImVec2 _SelectableTextAlign; + ImVec2 _DisplayWindowPadding; + ImVec2 _DisplaySafeAreaPadding; + float _MouseCursorScale; + bool _AntiAliasedLines; + bool _AntiAliasedFill; + float _CurveTessellationTol; + float _CircleSegmentMaxError; + ImVec4 _Colors[ImGuiCol_COUNT]; + + EngineReadFloat( _Alpha, fileHandle); + EngineReadImVec2( _WindowPadding, fileHandle); + EngineReadFloat( _WindowRounding, fileHandle); + EngineReadFloat( _WindowBorderSize, fileHandle); + EngineReadImVec2( _WindowMinSize, fileHandle); + EngineReadImVec2( _WindowTitleAlign, fileHandle); + EngineReadInt( _WindowMenuButtonPosition, fileHandle); + EngineReadFloat( _ChildRounding, fileHandle); + EngineReadFloat( _ChildBorderSize, fileHandle); + EngineReadFloat( _PopupRounding, fileHandle); + EngineReadFloat( _PopupBorderSize, fileHandle); + EngineReadImVec2( _FramePadding, fileHandle); + EngineReadFloat( _FrameRounding, fileHandle); + EngineReadFloat( _FrameBorderSize, fileHandle); + EngineReadImVec2( _ItemSpacing, fileHandle); + EngineReadImVec2( _ItemInnerSpacing, fileHandle); + EngineReadImVec2( _TouchExtraPadding, fileHandle); + EngineReadFloat( _IndentSpacing, fileHandle); + EngineReadFloat( _ColumnsMinSpacing, fileHandle); + EngineReadFloat( _ScrollbarSize, fileHandle); + EngineReadFloat( _ScrollbarRounding, fileHandle); + EngineReadFloat( _GrabMinSize, fileHandle); + EngineReadFloat( _GrabRounding, fileHandle); + EngineReadFloat( _TabRounding, fileHandle); + EngineReadFloat( _TabBorderSize, fileHandle); + EngineReadFloat( _TabMinWidthForUnselectedCloseButton, fileHandle); + EngineReadInt( _ColorButtonPosition, fileHandle); + EngineReadImVec2( _ButtonTextAlign, fileHandle); + EngineReadImVec2( _SelectableTextAlign, fileHandle); + EngineReadImVec2( _DisplayWindowPadding, fileHandle); + EngineReadImVec2( _DisplaySafeAreaPadding, fileHandle); + EngineReadFloat( _MouseCursorScale, fileHandle); + EngineReadBool(_AntiAliasedLines, fileHandle); + EngineReadBool(_AntiAliasedFill, fileHandle); + EngineReadFloat( _CurveTessellationTol, fileHandle); + EngineReadFloat( _CircleSegmentMaxError, fileHandle); + + for(int i=0; i