diff --git a/src/PowderToySDL.cpp b/src/PowderToySDL.cpp index 2259b6535..8d7185e87 100644 --- a/src/PowderToySDL.cpp +++ b/src/PowderToySDL.cpp @@ -176,6 +176,17 @@ void SDLOpen() } } + if (Client::Ref().GetPrefBool("AutoDrawLimit", false)) + { + SDL_DisplayMode displayMode; + SDL_GetCurrentDisplayMode(displayIndex, &displayMode); + + if(displayMode.refresh_rate >= 60) + { + ui::Engine::Ref().SetDrawingFrequencyLimit(displayMode.refresh_rate); + } + } + #ifdef WIN SDL_SysWMinfo SysInfo; SDL_VERSION(&SysInfo.version); @@ -497,9 +508,16 @@ void EngineProcess() { double frameTimeAvg = 0.0f, correctedFrameTimeAvg = 0.0f; SDL_Event event; + + int drawingTimer = 0; + int frameStart = 0; + while(engine->Running()) { - int frameStart = SDL_GetTicks(); + int oldFrameStart = frameStart; + frameStart = SDL_GetTicks(); + drawingTimer += frameStart - oldFrameStart; + if(engine->Broken()) { engine->UnBreak(); break; } event.type = 0; while (SDL_PollEvent(&event)) @@ -510,21 +528,27 @@ void EngineProcess() if(engine->Broken()) { engine->UnBreak(); break; } engine->Tick(); - engine->Draw(); - if (scale != engine->Scale || fullscreen != engine->Fullscreen || - altFullscreen != engine->GetAltFullscreen() || - forceIntegerScaling != engine->GetForceIntegerScaling() || resizable != engine->GetResizable()) + int drawcap = ui::Engine::Ref().GetDrawingFrequencyLimit(); + if (!drawcap || drawingTimer > 1000.f/drawcap) { - SDLSetScreen(engine->Scale, engine->GetResizable(), engine->Fullscreen, engine->GetAltFullscreen(), - engine->GetForceIntegerScaling()); - } + engine->Draw(); + drawingTimer = 0; + + if (scale != engine->Scale || fullscreen != engine->Fullscreen || + altFullscreen != engine->GetAltFullscreen() || + forceIntegerScaling != engine->GetForceIntegerScaling() || resizable != engine->GetResizable()) + { + SDLSetScreen(engine->Scale, engine->GetResizable(), engine->Fullscreen, engine->GetAltFullscreen(), + engine->GetForceIntegerScaling()); + } #ifdef OGLI - blit(); + blit(); #else - blit(engine->g->vid); + blit(engine->g->vid); #endif + } int frameTime = SDL_GetTicks() - frameStart; frameTimeAvg = frameTimeAvg * 0.8 + frameTime * 0.2; diff --git a/src/gui/interface/Engine.cpp b/src/gui/interface/Engine.cpp index eff118204..6c8981f03 100644 --- a/src/gui/interface/Engine.cpp +++ b/src/gui/interface/Engine.cpp @@ -17,6 +17,7 @@ using namespace ui; Engine::Engine(): FpsLimit(60.0f), + drawingFrequencyLimit(0), Scale(1), Fullscreen(false), FrameIndex(0), diff --git a/src/gui/interface/Engine.h b/src/gui/interface/Engine.h index 5c96e869c..a6dcaa52c 100644 --- a/src/gui/interface/Engine.h +++ b/src/gui/interface/Engine.h @@ -47,6 +47,8 @@ namespace ui void Break(); void UnBreak(); + void SetDrawingFrequencyLimit(int limit) {drawingFrequencyLimit = limit;} + inline int GetDrawingFrequencyLimit() {return drawingFrequencyLimit;} void SetFullscreen(bool fullscreen) { Fullscreen = fullscreen; } inline bool GetFullscreen() { return Fullscreen; } void SetAltFullscreen(bool altFullscreen) { this->altFullscreen = altFullscreen; } @@ -82,6 +84,7 @@ namespace ui //inline State* GetState() { return state_; } inline Window* GetWindow() { return state_; } float FpsLimit; + int drawingFrequencyLimit; Graphics * g; int Scale; bool Fullscreen; diff --git a/src/gui/options/OptionsController.cpp b/src/gui/options/OptionsController.cpp index 9ce0522ac..da69e286a 100644 --- a/src/gui/options/OptionsController.cpp +++ b/src/gui/options/OptionsController.cpp @@ -117,6 +117,11 @@ void OptionsController::SetMomentumScroll(bool momentumScroll) model->SetMomentumScroll(momentumScroll); } +void OptionsController::SetAutoDrawLimit(bool autoDrawLimit) +{ + model->SetAutoDrawLimit(autoDrawLimit); +} + void OptionsController::Exit() { view->CloseActiveWindow(); diff --git a/src/gui/options/OptionsController.h b/src/gui/options/OptionsController.h index 11a141126..bfcfb4a01 100644 --- a/src/gui/options/OptionsController.h +++ b/src/gui/options/OptionsController.h @@ -34,6 +34,7 @@ public: void SetIncludePressure(bool includePressure); void SetPerfectCircle(bool perfectCircle); void SetMomentumScroll(bool momentumScroll); + void SetAutoDrawLimit(bool autoDrawLimit); void Exit(); OptionsView * GetView(); diff --git a/src/gui/options/OptionsModel.cpp b/src/gui/options/OptionsModel.cpp index b6fec3b81..51ce3b72b 100644 --- a/src/gui/options/OptionsModel.cpp +++ b/src/gui/options/OptionsModel.cpp @@ -238,6 +238,17 @@ void OptionsModel::SetMomentumScroll(bool state) notifySettingsChanged(); } +bool OptionsModel::GetAutoDrawLimit() +{ + return Client::Ref().GetPrefBool("AutoDrawLimit", false); +} + +void OptionsModel::SetAutoDrawLimit(bool state) +{ + Client::Ref().SetPref("AutoDrawLimit", state); + notifySettingsChanged(); +} + void OptionsModel::notifySettingsChanged() { for (size_t i = 0; i < observers.size(); i++) diff --git a/src/gui/options/OptionsModel.h b/src/gui/options/OptionsModel.h index 7ccb51c30..2e5bd9346 100644 --- a/src/gui/options/OptionsModel.h +++ b/src/gui/options/OptionsModel.h @@ -53,6 +53,8 @@ public: void SetPerfectCircle(bool perfectCircle); bool GetMomentumScroll(); void SetMomentumScroll(bool momentumScroll); + bool GetAutoDrawLimit(); + void SetAutoDrawLimit(bool autoDrawLimit); virtual ~OptionsModel(); }; diff --git a/src/gui/options/OptionsView.cpp b/src/gui/options/OptionsView.cpp index 8ea2f3857..15cfed4b3 100644 --- a/src/gui/options/OptionsView.cpp +++ b/src/gui/options/OptionsView.cpp @@ -250,6 +250,17 @@ OptionsView::OptionsView(): scrollPanel->AddChild(tempLabel); scrollPanel->AddChild(momentumScroll); + currentY += 20; + autoDrawLimit = new ui::Checkbox(ui::Point(8, currentY), ui::Point(1, 16), "Auto Draw Rate", ""); + autowidth(autoDrawLimit); + autoDrawLimit->SetActionCallback({ [this] { c->SetAutoDrawLimit(autoDrawLimit->GetChecked()); } }); + tempLabel = new ui::Label(ui::Point(autoDrawLimit->Position.X + Graphics::textwidth(autoDrawLimit->GetText()) + 20, currentY), ui::Point(1, 16), "\bg- Based on monitor refresh rate at startup"); + autowidth(tempLabel); + tempLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; + tempLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle; + scrollPanel->AddChild(tempLabel); + scrollPanel->AddChild(autoDrawLimit); + currentY+=20; mouseClickRequired = new ui::Checkbox(ui::Point(8, currentY), ui::Point(1, 16), "Sticky Categories", ""); autowidth(mouseClickRequired); @@ -350,6 +361,7 @@ void OptionsView::NotifySettingsChanged(OptionsModel * sender) includePressure->SetChecked(sender->GetIncludePressure()); perfectCirclePressure->SetChecked(sender->GetPerfectCircle()); momentumScroll->SetChecked(sender->GetMomentumScroll()); + autoDrawLimit->SetChecked(sender->GetAutoDrawLimit()); } void OptionsView::AttachController(OptionsController * c_) diff --git a/src/gui/options/OptionsView.h b/src/gui/options/OptionsView.h index d564bdeb0..a3c2d0643 100644 --- a/src/gui/options/OptionsView.h +++ b/src/gui/options/OptionsView.h @@ -32,6 +32,7 @@ class OptionsView: public ui::Window ui::DropDown * decoSpace; ui::Checkbox * showAvatars; ui::Checkbox * momentumScroll; + ui::Checkbox * autoDrawLimit; ui::Checkbox * mouseClickRequired; ui::Checkbox * includePressure; ui::Checkbox * perfectCirclePressure; diff --git a/src/lua/LegacyLuaAPI.cpp b/src/lua/LegacyLuaAPI.cpp index 25e547453..9e1f54789 100644 --- a/src/lua/LegacyLuaAPI.cpp +++ b/src/lua/LegacyLuaAPI.cpp @@ -1378,6 +1378,21 @@ int luatpt_setfpscap(lua_State* l) return 0; } +int luatpt_setdrawcap(lua_State* l) +{ + int acount = lua_gettop(l); + if (acount == 0) + { + lua_pushinteger(l, ui::Engine::Ref().GetDrawingFrequencyLimit()); + return 1; + } + int drawcap = luaL_checkint(l, 1); + if(drawcap < 0) + return luaL_error(l, "draw cap too small"); + ui::Engine::Ref().SetDrawingFrequencyLimit(drawcap); + return 0; +} + int luatpt_getscript(lua_State* l) { int scriptID = luaL_checkinteger(l, 1); diff --git a/src/lua/LuaScriptHelper.h b/src/lua/LuaScriptHelper.h index 73fbf334d..98579f588 100644 --- a/src/lua/LuaScriptHelper.h +++ b/src/lua/LuaScriptHelper.h @@ -127,6 +127,7 @@ int luatpt_setfire(lua_State* l); int luatpt_setdebug(lua_State* l); int luatpt_setfpscap(lua_State* l); +int luatpt_setdrawcap(lua_State* l); int luatpt_getscript(lua_State* l); diff --git a/src/lua/LuaScriptInterface.cpp b/src/lua/LuaScriptInterface.cpp index dfdca4533..36b0cf1b2 100644 --- a/src/lua/LuaScriptInterface.cpp +++ b/src/lua/LuaScriptInterface.cpp @@ -213,6 +213,7 @@ LuaScriptInterface::LuaScriptInterface(GameController * c, GameModel * m): {"graphics_func",&luatpt_graphics_func}, {"get_clipboard", &platform_clipboardCopy}, {"set_clipboard", &platform_clipboardPaste}, + {"setdrawcap", &luatpt_setdrawcap}, {NULL,NULL} };