From 1b8f181df2de6727afb799e3460adffd1d19ae10 Mon Sep 17 00:00:00 2001 From: korenkonder Date: Sun, 24 Mar 2024 20:55:48 +0300 Subject: [PATCH] Fixed MLAA being a bit wrong --- src/DivaGL/render.cpp | 118 ++++++++++++++++++++++++++++-------------- 1 file changed, 78 insertions(+), 40 deletions(-) diff --git a/src/DivaGL/render.cpp b/src/DivaGL/render.cpp index 7cf6afa..e259211 100644 --- a/src/DivaGL/render.cpp +++ b/src/DivaGL/render.cpp @@ -1791,41 +1791,41 @@ namespace rndr { _data += MLAA_GRID_SIDE_LEN * 4 * 2; } } + + static float_t calc_area_tex_val(int32_t a1, int32_t a2) { + float_t v2 = (float_t)(-0.5 / ((float_t)a2 - 0.5)); + float_t v3 = (float_t)a1 * v2 + 0.5f; + if (a1 >= a2 - 1) + return (v3 * 0.5f) * 0.5f; + else + return ((float_t)(a1 + 1) * v2 + 0.5f + v3) * 0.5f; + }; static void calculate_mlaa_area_texture_data_inner(float_t* val_left, float_t* val_right, int32_t cross1, int32_t cross2, int32_t dleft, int32_t dright) { - auto calc_area_tex_val = [&](int32_t a1, int32_t a2) { - float_t v2 = (float_t)(-0.5 / ((float_t)a2 - 0.5)); - float_t v3 = (float_t)a1 * v2 + 0.5f; - if (a1 >= a2 - 1) - return (v3 * 0.5f) * 0.5f; - else - return ((float_t)(a1 + 1) * v2 + 0.5f + v3) * 0.5f; - }; - - int32_t dist = dleft + dright + 1; + int32_t d = dleft + dright + 1; float_t _val_left = 0.0f; float_t _val_right = 0.0f; switch (cross2) { case 0: switch (cross1) { case 1: - _val_right = calc_area_tex_val(dleft, min_def(dist, MLAA_GRID_SIDE_LEN)); + _val_right = calc_area_tex_val(dleft, min_def(d, MLAA_GRID_SIDE_LEN)); break; case 3: - _val_left = calc_area_tex_val(dleft, min_def(dist, MLAA_GRID_SIDE_LEN)); + _val_left = calc_area_tex_val(dleft, min_def(d, MLAA_GRID_SIDE_LEN)); break; } break; case 1: switch (cross1) { case 0: - _val_right = calc_area_tex_val(dright, min_def(dist, MLAA_GRID_SIDE_LEN)); + _val_right = calc_area_tex_val(dright, min_def(d, MLAA_GRID_SIDE_LEN)); break; case 1: - if (dist % 2) { - int32_t v12 = dist / 2 + 1; - int32_t v15 = dist / 2; + if (d % 2) { + int32_t v12 = d / 2 + 1; + int32_t v15 = d / 2; if (dleft < v15) _val_right = calc_area_tex_val(dleft, v12); else if (dright < v15) @@ -1834,7 +1834,7 @@ namespace rndr { _val_right = calc_area_tex_val(v15, v12) * 2.0f; } else { - int32_t v12 = dist / 2; + int32_t v12 = d / 2; float_t v14 = -0.5f / (float_t)v12; if (dleft >= v12) _val_right = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; @@ -1843,10 +1843,9 @@ namespace rndr { } break; case 3: - case 4: - if (dist % 2) { - int32_t v12 = dist / 2 + 1; - int32_t v15 = dist / 2; + if (d % 2) { + int32_t v12 = d / 2 + 1; + int32_t v15 = d / 2; if (dleft < v15) _val_left = calc_area_tex_val(dleft, v12); else if (dright < v15) @@ -1855,7 +1854,27 @@ namespace rndr { _val_left = _val_right = calc_area_tex_val(v15, v12); } else { - int32_t v12 = dist / 2; + int32_t v12 = d / 2; + float_t v14 = -0.5f / (float_t)v12; + if (dleft < v12) + _val_left = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; + else + _val_right = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; + } + break; + case 4: + if (d % 2) { + int32_t v12 = d / 2 + 1; + int32_t v15 = d / 2; + if (dleft < v15) + _val_left = calc_area_tex_val(dleft, v12); + else if (dright < v15) + _val_right = calc_area_tex_val(dright, v12); + else + _val_left = _val_right = calc_area_tex_val(v15, v12); + } + else { + int32_t v12 = d / 2; float_t v14 = -0.5f / (float_t)v12; if (dleft < v12) _val_left = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; @@ -1868,13 +1887,12 @@ namespace rndr { case 3: switch (cross1) { case 0: - _val_left = calc_area_tex_val(dright, min_def(dist, MLAA_GRID_SIDE_LEN)); + _val_left = calc_area_tex_val(dright, min_def(d, MLAA_GRID_SIDE_LEN)); break; case 1: - case 4: - if (dist % 2) { - int32_t v12 = dist / 2 + 1; - int32_t v15 = dist / 2; + if (d % 2) { + int32_t v12 = d / 2 + 1; + int32_t v15 = d / 2; if (dleft < v15) _val_right = calc_area_tex_val(dleft, v12); else if (dright < v15) @@ -1883,7 +1901,7 @@ namespace rndr { _val_left = _val_right = calc_area_tex_val(v15, v12); } else { - int32_t v12 = dist / 2; + int32_t v12 = d / 2; float_t v14 = -0.5f / (float_t)v12; if (dleft < v12) _val_right = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; @@ -1892,9 +1910,9 @@ namespace rndr { } break; case 3: - if (dist % 2) { - int32_t v12 = dist / 2 + 1; - int32_t v15 = dist / 2; + if (d % 2) { + int32_t v12 = d / 2 + 1; + int32_t v15 = d / 2; if (dleft < v15) _val_left = calc_area_tex_val(dleft, v12); else if (dright < v15) @@ -1903,7 +1921,7 @@ namespace rndr { _val_left = calc_area_tex_val(v15, v12) * 2.0f; } else { - int32_t v12 = dist / 2; + int32_t v12 = d / 2; float_t v14 = -0.5f / (float_t)v12; if (dleft < v12) _val_left = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; @@ -1911,14 +1929,34 @@ namespace rndr { _val_left = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; } break; + case 4: + if (d % 2) { + int32_t v12 = d / 2 + 1; + int32_t v15 = d / 2; + if (dleft < v15) + _val_right = calc_area_tex_val(dleft, v12); + else if (dright < v15) + _val_left = calc_area_tex_val(dright, v12); + else + _val_left = _val_right = calc_area_tex_val(v15, v12); + } + else { + int32_t v12 = d / 2; + float_t v14 = -0.5f / (float_t)v12; + if (dleft < v12) + _val_right = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; + else + _val_left = ((float_t)(dright * 2 + 1) * v14 + 1.0f) * 0.5f; + } + break; } break; case 4: switch (cross1) { case 1: - if (dist % 2) { - int32_t v12 = dist / 2 + 1; - int32_t v15 = dist / 2; + if (d % 2) { + int32_t v12 = d / 2 + 1; + int32_t v15 = d / 2; if (dleft < v15) _val_right = calc_area_tex_val(dleft, v12); else if (dright < v15) @@ -1927,7 +1965,7 @@ namespace rndr { _val_left = _val_right = calc_area_tex_val(v15, v12); } else { - int32_t v12 = dist / 2; + int32_t v12 = d / 2; float_t v14 = -0.5f / (float_t)v12; if (dleft < v12) _val_right = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f; @@ -1936,9 +1974,9 @@ namespace rndr { } break; case 3: - if (dist % 2) { - int32_t v12 = dist / 2 + 1; - int32_t v15 = dist / 2; + if (d % 2) { + int32_t v12 = d / 2 + 1; + int32_t v15 = d / 2; if (dleft < v15) _val_left = calc_area_tex_val(dleft, v12); else if (dright < v15) @@ -1947,7 +1985,7 @@ namespace rndr { _val_left = _val_right = calc_area_tex_val(v15, v12); } else { - int32_t v12 = dist / 2; + int32_t v12 = d / 2; float_t v14 = -0.5f / (float_t)v12; if (dleft < v12) _val_left = ((float_t)(dleft * 2 + 1) * v14 + 1.0f) * 0.5f;