From 184ff91453fea23b4b79168092f1fd3fe77d8576 Mon Sep 17 00:00:00 2001 From: fabiensanglard Date: Fri, 27 Apr 2018 23:50:00 +0300 Subject: [PATCH] Added Unreal kernel filtering. --- src/client/refresh/soft/sw_main.c | 2 ++ src/client/refresh/soft/sw_scan.c | 58 +++++++++++++++++++++++++++---- 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/client/refresh/soft/sw_main.c b/src/client/refresh/soft/sw_main.c index 7b3e59f25..98713a2ba 100644 --- a/src/client/refresh/soft/sw_main.c +++ b/src/client/refresh/soft/sw_main.c @@ -124,6 +124,7 @@ cvar_t *sw_surfcacheoverride; cvar_t *sw_waterwarp; static cvar_t *sw_overbrightbits; cvar_t *sw_custom_particles; +cvar_t *sw_texture_filtering; cvar_t *r_drawworld; static cvar_t *r_drawentities; @@ -272,6 +273,7 @@ R_Register (void) sw_waterwarp = ri.Cvar_Get ("sw_waterwarp", "1", 0); sw_overbrightbits = ri.Cvar_Get("sw_overbrightbits", "1.0", CVAR_ARCHIVE); sw_custom_particles = ri.Cvar_Get("sw_custom_particles", "0", CVAR_ARCHIVE); + sw_texture_filtering = ri.Cvar_Get("sw_texture_filtering", "0", CVAR_ARCHIVE); r_mode = ri.Cvar_Get( "r_mode", "0", CVAR_ARCHIVE ); r_lefthand = ri.Cvar_Get( "hand", "0", CVAR_USERINFO | CVAR_ARCHIVE ); diff --git a/src/client/refresh/soft/sw_scan.c b/src/client/refresh/soft/sw_scan.c index ebc9b2efd..5b2420d69 100644 --- a/src/client/refresh/soft/sw_scan.c +++ b/src/client/refresh/soft/sw_scan.c @@ -382,6 +382,19 @@ void NonTurbulent8 (espan_t *pspan) //PGM //==================== +// Enable custom filtering +extern cvar_t *sw_texture_filtering; +static int filtering_kernel[2][2][2] = { + { + {16384, 0}, + {49152, 32768} + }, + { + {32768, 49152}, + {0, 16384} + } +}; + /* ============= D_DrawSpans16 @@ -505,15 +518,46 @@ void D_DrawSpans16 (espan_t *pspan) } } - do + // Drawing phrase + if (sw_texture_filtering->value == 0.0f) + { + do + { + *pdest++ = *(pbase + (s >> 16) + (t >> 16) * cachewidth); + s += sstep; + t += tstep; + } while (--spancount > 0); + + s = snext; + t = tnext; + } + else if (sw_texture_filtering->value == 1.0f) { - *pdest++ = *(pbase + (s >> 16) + (t >> 16) * cachewidth); - s += sstep; - t += tstep; - } while (--spancount > 0); + do + { + int idiths = s; + int iditht = t; + + int X = (pspan->u + spancount) & 1; + int Y = (pspan->v)&1; + + //Using the kernel + idiths += filtering_kernel[X][Y][0]; + iditht += filtering_kernel[X][Y][1]; + + idiths = idiths >> 16; + idiths = idiths ? idiths -1 : idiths; - s = snext; - t = tnext; + + iditht = iditht >> 16; + iditht = iditht ? iditht -1 : iditht; + + + *pdest++ = *(pbase + idiths + iditht * cachewidth); + s += sstep; + t += tstep; + } while (--spancount > 0); + } } while (count > 0);