diff --git a/src/drawing/IDrawingEngine.h b/src/drawing/IDrawingEngine.h index 6868cdb1ef..42177ac10c 100644 --- a/src/drawing/IDrawingEngine.h +++ b/src/drawing/IDrawingEngine.h @@ -23,6 +23,16 @@ struct rct_drawpixelinfo; interface IDrawingContext; +enum DRAWING_ENGINE_FLAGS +{ + DEF_NONE = 0, + + /** + * Whether or not the engine will only draw changed blocks of the screen each frame. + */ + DEF_DIRTY_OPTIMISATIONS = 1 << 0, +}; + interface IDrawingEngine { virtual ~IDrawingEngine() { } @@ -36,6 +46,8 @@ interface IDrawingEngine virtual sint32 Screenshot() abstract; virtual IDrawingContext * GetDrawingContext(rct_drawpixelinfo * dpi) abstract; + + virtual DRAWING_ENGINE_FLAGS GetFlags() abstract; }; namespace DrawingEngineFactory diff --git a/src/drawing/NewDrawing.cpp b/src/drawing/NewDrawing.cpp index ae76739dd3..b1434c9c99 100644 --- a/src/drawing/NewDrawing.cpp +++ b/src/drawing/NewDrawing.cpp @@ -66,6 +66,16 @@ extern "C" _drawingEngine = nullptr; } + bool drawing_engine_has_dirty_optimisations() + { + bool result = false; + if (_drawingEngine != nullptr) + { + result = (_drawingEngine->GetFlags() & DEF_DIRTY_OPTIMISATIONS); + } + return result; + } + void gfx_set_dirty_blocks(sint16 left, sint16 top, sint16 right, sint16 bottom) { if (_drawingEngine != nullptr) diff --git a/src/drawing/NewDrawing.h b/src/drawing/NewDrawing.h index 0e7ece76cb..597baea001 100644 --- a/src/drawing/NewDrawing.h +++ b/src/drawing/NewDrawing.h @@ -27,6 +27,8 @@ void drawing_engine_set_palette(SDL_Color * colours); void drawing_engine_draw(); void drawing_engine_dispose(); +bool drawing_engine_has_dirty_optimisations(); + #ifdef _cplusplus } #endif diff --git a/src/drawing/engines/OpenGLDrawingEngine.cpp b/src/drawing/engines/OpenGLDrawingEngine.cpp index a7aa562356..65f7063146 100644 --- a/src/drawing/engines/OpenGLDrawingEngine.cpp +++ b/src/drawing/engines/OpenGLDrawingEngine.cpp @@ -202,6 +202,11 @@ public: return _drawingContext; } + DRAWING_ENGINE_FLAGS GetFlags() override + { + return DEF_NONE; + } + rct_drawpixelinfo * GetDPI() { return &_bitsDPI; diff --git a/src/drawing/engines/SoftwareDrawingEngine.cpp b/src/drawing/engines/SoftwareDrawingEngine.cpp index 6f6a679328..ed472f4b51 100644 --- a/src/drawing/engines/SoftwareDrawingEngine.cpp +++ b/src/drawing/engines/SoftwareDrawingEngine.cpp @@ -327,6 +327,11 @@ public: return _drawingContext; } + DRAWING_ENGINE_FLAGS GetFlags() override + { + return DEF_DIRTY_OPTIMISATIONS; + } + rct_drawpixelinfo * GetDPI() { return &_bitsDPI; diff --git a/src/interface/viewport.c b/src/interface/viewport.c index b040473fc6..d45a31d4fa 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -395,7 +395,8 @@ void sub_6E7FF3(rct_window *window, rct_viewport *viewport, int x, int y) } } -void sub_6E7F34(rct_window* w, rct_viewport* viewport, sint16 x_diff, sint16 y_diff){ +void viewport_shift_pixels(rct_window* w, rct_viewport* viewport, sint16 x_diff, sint16 y_diff) +{ rct_window* orignal_w = w; int left = 0, right = 0, top = 0, bottom = 0; @@ -430,7 +431,8 @@ void sub_6E7F34(rct_window* w, rct_viewport* viewport, sint16 x_diff, sint16 y_d sub_6E7FF3(w, viewport, x_diff, y_diff); } -void sub_6E7DE1(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport){ +void viewport_move(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport) +{ uint8 zoom = (1 << viewport->zoom); // Note: do not do the subtraction and then divide! @@ -497,7 +499,9 @@ void sub_6E7DE1(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport){ return; } - sub_6E7F34(w, viewport, x_diff, y_diff); + if (drawing_engine_has_dirty_optimisations()) { + viewport_shift_pixels(w, viewport, x_diff, y_diff); + } memcpy(viewport, &view_copy, sizeof(rct_viewport)); } @@ -625,7 +629,7 @@ void viewport_update_position(rct_window *window) y += viewport->view_y; } - sub_6E7DE1(x, y, window, viewport); + viewport_move(x, y, window, viewport); } void viewport_update_sprite_follow(rct_window *window) @@ -641,7 +645,7 @@ void viewport_update_sprite_follow(rct_window *window) int center_x, center_y; center_2d_coordinates(sprite->unknown.x, sprite->unknown.y, sprite->unknown.z, ¢er_x, ¢er_y, window->viewport); - sub_6E7DE1(center_x, center_y, window, window->viewport); + viewport_move(center_x, center_y, window, window->viewport); } }