do not shift viewport pixels on OpenGL

This commit is contained in:
Ted John 2016-06-05 16:41:35 +01:00
parent a8fed0c4b8
commit 932dec75d0
6 changed files with 43 additions and 5 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -202,6 +202,11 @@ public:
return _drawingContext;
}
DRAWING_ENGINE_FLAGS GetFlags() override
{
return DEF_NONE;
}
rct_drawpixelinfo * GetDPI()
{
return &_bitsDPI;

View File

@ -327,6 +327,11 @@ public:
return _drawingContext;
}
DRAWING_ENGINE_FLAGS GetFlags() override
{
return DEF_DIRTY_OPTIMISATIONS;
}
rct_drawpixelinfo * GetDPI()
{
return &_bitsDPI;

View File

@ -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, &center_x, &center_y, window->viewport);
sub_6E7DE1(center_x, center_y, window, window->viewport);
viewport_move(center_x, center_y, window, window->viewport);
}
}