From a20b16f6516821da7c59640a7b7329038dd29219 Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Tue, 16 Dec 2014 21:56:08 +0100 Subject: [PATCH 1/5] Fix a bug in sub_6E7F34 and reenable new code --- src/interface/viewport.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 8903cd157c..46e6338eca 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -298,8 +298,8 @@ void sub_689174(sint16* x, sint16* y, sint16 *z, uint8 curr_rotation){ // //} -void sub_6E7F34(rct_window* w, rct_viewport* viewport){ - //RCT2_CALLPROC_X(0x6E7F34, 0, 0, 0, 0, (int)viewport, (int)w, 0); +void sub_6E7F34(sint16 previous_x, sint16 previous_y, rct_window* w, rct_viewport* viewport){ + //RCT2_CALLPROC_X(0x6E7F34, 0, 0, 0, previous_x, (int)viewport, (int)w, previous_y); rct_window* orignal_w = w; int left = 0, right = 0, top = 0, bottom = 0; @@ -331,7 +331,7 @@ void sub_6E7F34(rct_window* w, rct_viewport* viewport){ } w = orignal_w; - RCT2_CALLPROC_X(0x6E7FF3, 0, 0, 0, right, (int)viewport, (int)w, bottom); + RCT2_CALLPROC_X(0x6E7FF3, 0, 0, 0, previous_x, (int)viewport, (int)w, previous_y); } /* There is a bug in this. */ @@ -400,8 +400,8 @@ void sub_6E7DE1(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport){ return; } - //sub_6E7F34(w, viewport); - //RCT2_CALLPROC_X(0x6E7F34, 0, 0, 0, 0, (int)viewport, (int)w, 0); + sub_6E7F34(previous_x, previous_y, w, viewport); + //RCT2_CALLPROC_X(0x6E7F34, 0, 0, 0, previous_x, (int)viewport, (int)w, previous_y); memcpy(viewport, &view_copy, sizeof(rct_viewport)); } @@ -430,8 +430,8 @@ void viewport_update_position(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, viewport); - RCT2_CALLPROC_X(0x6E7DE1, center_x, center_y, 0, 0, (int)window, (int)viewport, 0); + sub_6E7DE1(center_x, center_y, window, viewport); + //RCT2_CALLPROC_X(0x6E7DE1, center_x, center_y, 0, 0, (int)window, (int)viewport, 0); return; } @@ -523,8 +523,8 @@ void viewport_update_position(rct_window *window) y += viewport->view_y; } - //sub_6E7DE1(x, y, window, viewport); - RCT2_CALLPROC_X(0x6E7DE1, x, y, 0, 0, (int)window, (int)viewport, 0); + sub_6E7DE1(x, y, window, viewport); + //RCT2_CALLPROC_X(0x6E7DE1, x, y, 0, 0, (int)window, (int)viewport, 0); } void viewport_paint(rct_viewport* viewport, rct_drawpixelinfo* dpi, int left, int top, int right, int bottom); From 7611cd0ad622df4b692c18d8d36ef53c2411a0cc Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Tue, 16 Dec 2014 21:57:22 +0100 Subject: [PATCH 2/5] Condition fix in viewport.c --- src/interface/viewport.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 46e6338eca..593c6d4d52 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -304,7 +304,7 @@ void sub_6E7F34(sint16 previous_x, sint16 previous_y, rct_window* w, rct_viewpor int left = 0, right = 0, top = 0, bottom = 0; for (; w < RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*); w++){ - if (!w->flags&WF_TRANSPARENT) continue; + if (!(w->flags & WF_TRANSPARENT)) continue; if (w->viewport == viewport) continue; if (viewport->x + viewport->width <= w->x)continue; From 03da2b07a6e3ba508059b0b83f6fed527a4b59d3 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Wed, 17 Dec 2014 20:19:10 +0000 Subject: [PATCH 3/5] Fix viewport tearing. --- src/interface/viewport.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 593c6d4d52..c3747009ab 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -298,7 +298,7 @@ void sub_689174(sint16* x, sint16* y, sint16 *z, uint8 curr_rotation){ // //} -void sub_6E7F34(sint16 previous_x, sint16 previous_y, rct_window* w, rct_viewport* viewport){ +void sub_6E7F34(rct_window* w, rct_viewport* viewport){ //RCT2_CALLPROC_X(0x6E7F34, 0, 0, 0, previous_x, (int)viewport, (int)w, previous_y); rct_window* orignal_w = w; int left = 0, right = 0, top = 0, bottom = 0; @@ -318,11 +318,11 @@ void sub_6E7F34(sint16 previous_x, sint16 previous_y, rct_window* w, rct_viewpor top = w->y; bottom = w->y + w->height; - if (left >= viewport->x)left = viewport->x; - if (right >= viewport->x + viewport->width) right = viewport->x + viewport->width; + if (left < viewport->x)left = viewport->x; + if (right > viewport->x + viewport->width) right = viewport->x + viewport->width; - if (top >= viewport->y)top = viewport->y; - if (bottom >= viewport->y + viewport->height) bottom = viewport->y + viewport->height; + if (top < viewport->y)top = viewport->y; + if (bottom > viewport->y + viewport->height) bottom = viewport->y + viewport->height; if (left >= right) continue; if (top >= bottom) continue; @@ -331,7 +331,7 @@ void sub_6E7F34(sint16 previous_x, sint16 previous_y, rct_window* w, rct_viewpor } w = orignal_w; - RCT2_CALLPROC_X(0x6E7FF3, 0, 0, 0, previous_x, (int)viewport, (int)w, previous_y); + RCT2_CALLPROC_X(0x6E7FF3, 0, 0, 0, right, (int)viewport, (int)w, bottom); } /* There is a bug in this. */ @@ -346,7 +346,7 @@ void sub_6E7DE1(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport){ viewport->view_x = x; viewport->view_y = y; - if (((x / zoom) == previous_x) && ((y / zoom) == previous_y)) return; + if (((x / zoom) == previous_x) && ((y / zoom) == previous_y))return; if (w->flags & WF_7){ int left = max(viewport->x, 0); @@ -400,8 +400,8 @@ void sub_6E7DE1(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport){ return; } - sub_6E7F34(previous_x, previous_y, w, viewport); - //RCT2_CALLPROC_X(0x6E7F34, 0, 0, 0, previous_x, (int)viewport, (int)w, previous_y); + sub_6E7F34(w, viewport); + //RCT2_CALLPROC_X(0x6E7F34, 0, 0, 0, 0, (int)viewport, (int)w, 0); memcpy(viewport, &view_copy, sizeof(rct_viewport)); } From c0378279f8e184344e1342c8e187fd4a07624757 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Wed, 17 Dec 2014 22:08:57 +0000 Subject: [PATCH 4/5] Properly pass dx and bp --- src/interface/viewport.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index c3747009ab..0ab7e68bcf 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -298,8 +298,8 @@ void sub_689174(sint16* x, sint16* y, sint16 *z, uint8 curr_rotation){ // //} -void sub_6E7F34(rct_window* w, rct_viewport* viewport){ - //RCT2_CALLPROC_X(0x6E7F34, 0, 0, 0, previous_x, (int)viewport, (int)w, previous_y); +void sub_6E7F34(rct_window* w, rct_viewport* viewport, sint16 x_diff, sint16 y_diff){ + //RCT2_CALLPROC_X(0x6E7F34, 0, 0, 0, x_diff, (int)viewport, (int)w, y_diff); rct_window* orignal_w = w; int left = 0, right = 0, top = 0, bottom = 0; @@ -331,7 +331,7 @@ void sub_6E7F34(rct_window* w, rct_viewport* viewport){ } w = orignal_w; - RCT2_CALLPROC_X(0x6E7FF3, 0, 0, 0, right, (int)viewport, (int)w, bottom); + RCT2_CALLPROC_X(0x6E7FF3, 0, 0, 0, x_diff, (int)viewport, (int)w, y_diff); } /* There is a bug in this. */ @@ -340,13 +340,14 @@ void sub_6E7DE1(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport){ //return; uint8 zoom = (1 << viewport->zoom); - sint16 previous_x = viewport->view_x / zoom; - sint16 previous_y = viewport->view_y / zoom; + sint16 x_diff = (viewport->view_x - x) / zoom; + sint16 y_diff = (viewport->view_y - y) / zoom; viewport->view_x = x; viewport->view_y = y; - if (((x / zoom) == previous_x) && ((y / zoom) == previous_y))return; + // If no change in viewing area + if ((!x_diff) && (!y_diff))return; if (w->flags & WF_7){ int left = max(viewport->x, 0); @@ -400,8 +401,8 @@ void sub_6E7DE1(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport){ return; } - sub_6E7F34(w, viewport); - //RCT2_CALLPROC_X(0x6E7F34, 0, 0, 0, 0, (int)viewport, (int)w, 0); + sub_6E7F34(w, viewport, x_diff, y_diff); + //RCT2_CALLPROC_X(0x6E7F34, 0, 0, 0, x_diff, (int)viewport, (int)w, y_diff); memcpy(viewport, &view_copy, sizeof(rct_viewport)); } From 8d65078abf6c416c8358a8e91230b49bd2383d83 Mon Sep 17 00:00:00 2001 From: Adrian Wielgosik Date: Wed, 17 Dec 2014 23:30:39 +0100 Subject: [PATCH 5/5] Remove a no longer relevant comment --- src/interface/viewport.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 0ab7e68bcf..20d19debc7 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -334,7 +334,6 @@ void sub_6E7F34(rct_window* w, rct_viewport* viewport, sint16 x_diff, sint16 y_d RCT2_CALLPROC_X(0x6E7FF3, 0, 0, 0, x_diff, (int)viewport, (int)w, y_diff); } -/* There is a bug in this. */ void sub_6E7DE1(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport){ //RCT2_CALLPROC_X(0x6E7DE1, x, y, 0, 0, w, viewport, 0); //return;