From 3753e5942da01a717ef21a729a48aa6d5b4a74b7 Mon Sep 17 00:00:00 2001 From: ziplantil Date: Sat, 27 Jul 2019 23:32:32 +0300 Subject: [PATCH 1/5] fix effect (on GL) when picking up cloak --- similar/arch/ogl/gr.cpp | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/similar/arch/ogl/gr.cpp b/similar/arch/ogl/gr.cpp index a17b5c49c..048cdceb4 100644 --- a/similar/arch/ogl/gr.cpp +++ b/similar/arch/ogl/gr.cpp @@ -75,7 +75,9 @@ #include "compiler-make_unique.h" +using std::min; using std::max; +using std::abs; namespace dcx { @@ -1042,11 +1044,22 @@ void ogl_ulinec(grs_canvas &canvas, const int left, const int top, const int rig } static GLfloat last_r, last_g, last_b; +static GLfloat alast_r, alast_g, alast_b; static int do_pal_step; void ogl_do_palfx(void) { - GLfloat color_array[] = { last_r, last_g, last_b, 1.0, last_r, last_g, last_b, 1.0, last_r, last_g, last_b, 1.0, last_r, last_g, last_b, 1.0 }; + // scale negative effect by 2.5 to match D1/D2 on GL + alast_r = abs(last_r) * (last_r < 0 ? 2.5 : 1.0); + alast_g = abs(last_g) * (last_g < 0 ? 2.5 : 1.0); + alast_b = abs(last_b) * (last_b < 0 ? 2.5 : 1.0); + + GLfloat color_array[] = { + alast_r, alast_g, alast_b, 1.0, + alast_r, alast_g, alast_b, 1.0, + alast_r, alast_g, alast_b, 1.0, + alast_r, alast_g, alast_b, 1.0 + }; OGL_DISABLE(TEXTURE_2D); @@ -1056,7 +1069,10 @@ void ogl_do_palfx(void) if (do_pal_step) { glEnable(GL_BLEND); - glBlendFunc(GL_ONE,GL_ONE); + if ((last_r <= 0) & (last_g <= 0) & (last_b <= 0)) + glBlendFunc(GL_ZERO,GL_ONE_MINUS_SRC_COLOR); + else + glBlendFunc(GL_ONE,GL_ONE); } else return; @@ -1082,9 +1098,20 @@ void gr_palette_step_up(int r, int g, int b) old_b_g = ogl_brightness_g; old_b_b = ogl_brightness_b; - ogl_brightness_r = max(r + gr_palette_gamma, 0); - ogl_brightness_g = max(g + gr_palette_gamma, 0); - ogl_brightness_b = max(b + gr_palette_gamma, 0); + if (r >= 0) + ogl_brightness_r = max(r + gr_palette_gamma, 0); + else + ogl_brightness_r = min(r + gr_palette_gamma, 0); + + if (g >= 0) + ogl_brightness_g = max(g + gr_palette_gamma, 0); + else + ogl_brightness_g = min(g + gr_palette_gamma, 0); + + if (b >= 0) + ogl_brightness_b = max(b + gr_palette_gamma, 0); + else + ogl_brightness_b = min(b + gr_palette_gamma, 0); if (!ogl_brightness_ok) { From 4eab54284c1c094fba91270a64ca68e8ba599f4d Mon Sep 17 00:00:00 2001 From: ziplantil Date: Sun, 28 Jul 2019 00:42:37 +0300 Subject: [PATCH 2/5] change palfx code; special only for all < 0 (cloak) --- similar/arch/ogl/gr.cpp | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/similar/arch/ogl/gr.cpp b/similar/arch/ogl/gr.cpp index 048cdceb4..947349656 100644 --- a/similar/arch/ogl/gr.cpp +++ b/similar/arch/ogl/gr.cpp @@ -1049,16 +1049,11 @@ static int do_pal_step; void ogl_do_palfx(void) { - // scale negative effect by 2.5 to match D1/D2 on GL - alast_r = abs(last_r) * (last_r < 0 ? 2.5 : 1.0); - alast_g = abs(last_g) * (last_g < 0 ? 2.5 : 1.0); - alast_b = abs(last_b) * (last_b < 0 ? 2.5 : 1.0); - GLfloat color_array[] = { - alast_r, alast_g, alast_b, 1.0, - alast_r, alast_g, alast_b, 1.0, - alast_r, alast_g, alast_b, 1.0, - alast_r, alast_g, alast_b, 1.0 + last_r, last_g, last_b, 1.0, + last_r, last_g, last_b, 1.0, + last_r, last_g, last_b, 1.0, + last_r, last_g, last_b, 1.0 }; OGL_DISABLE(TEXTURE_2D); @@ -1066,13 +1061,26 @@ void ogl_do_palfx(void) glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); - if (do_pal_step) + if (do_pal_step && ((last_r <= 0) & (last_g <= 0) & (last_b <= 0))) { + // scale negative effect by 2.5 to match D1/D2 on GL + alast_r = abs(last_r) * 2.5; + alast_g = abs(last_g) * 2.5; + alast_b = abs(last_b) * 2.5; + + color_array[ 0] = color_array[ 4] = alast_r; + color_array[ 8] = color_array[12] = alast_r; + color_array[ 1] = color_array[ 5] = alast_g; + color_array[ 9] = color_array[13] = alast_g; + color_array[ 2] = color_array[ 6] = alast_b; + color_array[10] = color_array[14] = alast_b; + + glEnable(GL_BLEND); + glBlendFunc(GL_ZERO,GL_ONE_MINUS_SRC_COLOR); + } + else if (do_pal_step) { glEnable(GL_BLEND); - if ((last_r <= 0) & (last_g <= 0) & (last_b <= 0)) - glBlendFunc(GL_ZERO,GL_ONE_MINUS_SRC_COLOR); - else - glBlendFunc(GL_ONE,GL_ONE); + glBlendFunc(GL_ONE,GL_ONE); } else return; From f446790b035365a92f946f349acaf1f72952c9bf Mon Sep 17 00:00:00 2001 From: ziplantil Date: Sun, 28 Jul 2019 00:49:30 +0300 Subject: [PATCH 3/5] optimize; abs no longer necessary --- similar/arch/ogl/gr.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/similar/arch/ogl/gr.cpp b/similar/arch/ogl/gr.cpp index 947349656..0e3865272 100644 --- a/similar/arch/ogl/gr.cpp +++ b/similar/arch/ogl/gr.cpp @@ -77,7 +77,6 @@ using std::min; using std::max; -using std::abs; namespace dcx { @@ -1063,9 +1062,10 @@ void ogl_do_palfx(void) if (do_pal_step && ((last_r <= 0) & (last_g <= 0) & (last_b <= 0))) { // scale negative effect by 2.5 to match D1/D2 on GL - alast_r = abs(last_r) * 2.5; - alast_g = abs(last_g) * 2.5; - alast_b = abs(last_b) * 2.5; + // also make values positive to actually have an effect + alast_r = last_r * -2.5; + alast_g = last_g * -2.5; + alast_b = last_b * -2.5; color_array[ 0] = color_array[ 4] = alast_r; color_array[ 8] = color_array[12] = alast_r; From 4f3b2a1520c58d48a3087ef078c8bd308aa1571a Mon Sep 17 00:00:00 2001 From: ziplantil Date: Sun, 28 Jul 2019 01:41:37 +0300 Subject: [PATCH 4/5] make alast_* function-local --- similar/arch/ogl/gr.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/similar/arch/ogl/gr.cpp b/similar/arch/ogl/gr.cpp index 0e3865272..30acfd6c8 100644 --- a/similar/arch/ogl/gr.cpp +++ b/similar/arch/ogl/gr.cpp @@ -1043,7 +1043,6 @@ void ogl_ulinec(grs_canvas &canvas, const int left, const int top, const int rig } static GLfloat last_r, last_g, last_b; -static GLfloat alast_r, alast_g, alast_b; static int do_pal_step; void ogl_do_palfx(void) @@ -1063,9 +1062,9 @@ void ogl_do_palfx(void) if (do_pal_step && ((last_r <= 0) & (last_g <= 0) & (last_b <= 0))) { // scale negative effect by 2.5 to match D1/D2 on GL // also make values positive to actually have an effect - alast_r = last_r * -2.5; - alast_g = last_g * -2.5; - alast_b = last_b * -2.5; + GLfloat alast_r = last_r * -2.5; + GLfloat alast_g = last_g * -2.5; + GLfloat alast_b = last_b * -2.5; color_array[ 0] = color_array[ 4] = alast_r; color_array[ 8] = color_array[12] = alast_r; From 639d33b4def323173858e2d491934d4f71ef80a1 Mon Sep 17 00:00:00 2001 From: ziplantil Date: Sun, 28 Jul 2019 12:47:24 +0300 Subject: [PATCH 5/5] reorder palfx logic; use inline func in gr_palette_step_up --- similar/arch/ogl/gr.cpp | 70 +++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 37 deletions(-) diff --git a/similar/arch/ogl/gr.cpp b/similar/arch/ogl/gr.cpp index 30acfd6c8..7cdfe973d 100644 --- a/similar/arch/ogl/gr.cpp +++ b/similar/arch/ogl/gr.cpp @@ -1047,42 +1047,41 @@ static int do_pal_step; void ogl_do_palfx(void) { - GLfloat color_array[] = { - last_r, last_g, last_b, 1.0, - last_r, last_g, last_b, 1.0, - last_r, last_g, last_b, 1.0, - last_r, last_g, last_b, 1.0 - }; - OGL_DISABLE(TEXTURE_2D); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); - - if (do_pal_step && ((last_r <= 0) & (last_g <= 0) & (last_b <= 0))) { + + GLfloat alast_r = last_r; + GLfloat alast_g = last_g; + GLfloat alast_b = last_b; + + if (!do_pal_step) { + return; + } + else if (last_r <= 0 && last_g <= 0 && last_b <= 0) + { // scale negative effect by 2.5 to match D1/D2 on GL // also make values positive to actually have an effect - GLfloat alast_r = last_r * -2.5; - GLfloat alast_g = last_g * -2.5; - GLfloat alast_b = last_b * -2.5; - - color_array[ 0] = color_array[ 4] = alast_r; - color_array[ 8] = color_array[12] = alast_r; - color_array[ 1] = color_array[ 5] = alast_g; - color_array[ 9] = color_array[13] = alast_g; - color_array[ 2] = color_array[ 6] = alast_b; - color_array[10] = color_array[14] = alast_b; - + alast_r = last_r * -2.5; + alast_g = last_g * -2.5; + alast_b = last_b * -2.5; + glEnable(GL_BLEND); glBlendFunc(GL_ZERO,GL_ONE_MINUS_SRC_COLOR); } - else if (do_pal_step) + else { glEnable(GL_BLEND); glBlendFunc(GL_ONE,GL_ONE); } - else - return; + + GLfloat color_array[] = { + alast_r, alast_g, alast_b, 1.0, + alast_r, alast_g, alast_b, 1.0, + alast_r, alast_g, alast_b, 1.0, + alast_r, alast_g, alast_b, 1.0 + }; array vertices = {{ 0, 0, 0, 1, 1, 1, 1, 0 @@ -1099,26 +1098,23 @@ void ogl_do_palfx(void) static int ogl_brightness_ok; static int old_b_r, old_b_g, old_b_b; +inline int gr_apply_gamma_clamp(int v) +{ + if (v >= 0) + return max(v + gr_palette_gamma, 0); + else + return min(v + gr_palette_gamma, 0); +} + void gr_palette_step_up(int r, int g, int b) { old_b_r = ogl_brightness_r; old_b_g = ogl_brightness_g; old_b_b = ogl_brightness_b; - if (r >= 0) - ogl_brightness_r = max(r + gr_palette_gamma, 0); - else - ogl_brightness_r = min(r + gr_palette_gamma, 0); - - if (g >= 0) - ogl_brightness_g = max(g + gr_palette_gamma, 0); - else - ogl_brightness_g = min(g + gr_palette_gamma, 0); - - if (b >= 0) - ogl_brightness_b = max(b + gr_palette_gamma, 0); - else - ogl_brightness_b = min(b + gr_palette_gamma, 0); + ogl_brightness_r = gr_apply_gamma_clamp(r); + ogl_brightness_g = gr_apply_gamma_clamp(g); + ogl_brightness_b = gr_apply_gamma_clamp(b); if (!ogl_brightness_ok) {