diff --git a/src/r_draw.h b/src/r_draw.h index bd477efc4..6a078b08f 100644 --- a/src/r_draw.h +++ b/src/r_draw.h @@ -379,6 +379,10 @@ void R_SetDSColorMapLight(FColormap *base_colormap, float light, int shade); void R_SetTranslationMap(lighttable_t *translation); extern bool r_swtruecolor; -EXTERN_CVAR(Bool, r_bilinear); + +EXTERN_CVAR(Bool, r_multithreaded); +EXTERN_CVAR(Bool, r_magfilter_linear); +EXTERN_CVAR(Bool, r_minfilter_linear); +EXTERN_CVAR(Bool, r_mipmap); #endif diff --git a/src/r_draw_rgba.cpp b/src/r_draw_rgba.cpp index dc97fdd47..5a6e88e3b 100644 --- a/src/r_draw_rgba.cpp +++ b/src/r_draw_rgba.cpp @@ -60,9 +60,10 @@ extern float rw_light; extern float rw_lightstep; extern int wallshade; -CVAR(Bool, r_multithreaded, true, 0) -CVAR(Bool, r_bilinear, true, 0) -CVAR(Bool, r_mipmap, true, 0) +CVAR(Bool, r_multithreaded, true, 0); +CVAR(Bool, r_magfilter_linear, false, 0); +CVAR(Bool, r_minfilter_linear, false, 0); +CVAR(Bool, r_mipmap, true, 0); #ifndef NO_SSE @@ -904,7 +905,7 @@ public: const uint32_t * RESTRICT _source; uint32_t _light; ShadeConstants _shade_constants; - bool _magnifying; + bool _nearest_filter; uint32_t _srcalpha; uint32_t _destalpha; @@ -925,7 +926,7 @@ public: _source = (const uint32_t*)ds_source; _light = LightBgra::calc_light_multiplier(ds_light); _shade_constants = ds_shade_constants; - _magnifying = !SampleBgra::span_sampler_setup(_source, _xbits, _ybits, _xstep, _ystep); + _nearest_filter = !SampleBgra::span_sampler_setup(_source, _xbits, _ybits, _xstep, _ystep); _srcalpha = dc_srcalpha >> (FRACBITS - 8); _destalpha = dc_destalpha >> (FRACBITS - 8); @@ -995,7 +996,7 @@ public: LoopIterator loop(this, thread); if (!loop) return; - if (_magnifying) + if (_nearest_filter) { if (loop.is_64x64) { @@ -1040,7 +1041,7 @@ public: LoopIterator loop(this, thread); if (!loop) return; - if (_magnifying) + if (_nearest_filter) { if (loop.is_64x64) { diff --git a/src/r_draw_rgba.h b/src/r_draw_rgba.h index 20fff4fc0..56f1faa24 100644 --- a/src/r_draw_rgba.h +++ b/src/r_draw_rgba.h @@ -461,15 +461,11 @@ class SampleBgra public: inline static bool span_sampler_setup(const uint32_t * RESTRICT &source, int &xbits, int &ybits, fixed_t xstep, fixed_t ystep) { - if (!r_bilinear) - return false; - // Is this a magfilter or minfilter? fixed_t xmagnitude = abs(xstep) >> (32 - xbits - FRACBITS); fixed_t ymagnitude = abs(ystep) >> (32 - ybits - FRACBITS); fixed_t magnitude = (xmagnitude + ymagnitude) * 2 + (1 << (FRACBITS - 1)); - if (magnitude >> FRACBITS == 0) - return false; + bool magnifying = (magnitude >> FRACBITS == 0); if (r_mipmap) { @@ -485,7 +481,8 @@ public: level >>= 1; } } - return true; + + return (magnifying && r_magfilter_linear) || (!magnifying && r_minfilter_linear); } FORCEINLINE static uint32_t sample_bilinear(const uint32_t *col0, const uint32_t *col1, uint32_t texturefracx, uint32_t texturefracy, int ybits, uint32_t ymax) diff --git a/src/r_draw_rgba_sse.h b/src/r_draw_rgba_sse.h index 408a2f5a2..bca30185c 100644 --- a/src/r_draw_rgba_sse.h +++ b/src/r_draw_rgba_sse.h @@ -25,7 +25,7 @@ class VecCommand(DrawSpanRGBA) : public DrawerCommand BYTE * RESTRICT _destorg; fixed_t _light; ShadeConstants _shade_constants; - bool _magnifying; + bool _nearest_filter; public: VecCommand(DrawSpanRGBA)() @@ -43,7 +43,7 @@ public: _destorg = dc_destorg; _light = ds_light; _shade_constants = ds_shade_constants; - _magnifying = !SampleBgra::span_sampler_setup(_source, _xbits, _ybits, _xstep, _ystep); + _nearest_filter = !SampleBgra::span_sampler_setup(_source, _xbits, _ybits, _xstep, _ystep); } void Execute(DrawerThread *thread) override @@ -73,7 +73,7 @@ public: uint32_t light = LightBgra::calc_light_multiplier(_light); ShadeConstants shade_constants = _shade_constants; - if (_magnifying) + if (_nearest_filter) { if (_xbits == 6 && _ybits == 6) { diff --git a/src/r_segs.cpp b/src/r_segs.cpp index 95dd287aa..5c9037375 100644 --- a/src/r_segs.cpp +++ b/src/r_segs.cpp @@ -50,6 +50,7 @@ #include "r_plane.h" #include "r_segs.h" #include "r_3dfloors.h" +#include "r_draw.h" #include "v_palette.h" #include "r_data/colormaps.h" @@ -58,8 +59,6 @@ CVAR(Bool, r_np2, true, 0) -EXTERN_CVAR(Bool, r_bilinear) - //CVAR (Int, ty, 8, 0) //CVAR (Int, tx, 8, 0) @@ -1104,8 +1103,7 @@ WallscanSampler::WallscanSampler(int y1, float swal, double yrepeat, fixed_t xof bool magnifying = uv_step >> (uv_fracbits - 1) == 0; - // Only do bilinear filtering if enabled and not a magnifying filter - if (!r_swtruecolor || !r_bilinear || magnifying || getcol != R_GetColumn) + if (!r_swtruecolor || getcol != R_GetColumn) { source = getcol(texture, xoffset >> FRACBITS); source2 = nullptr; @@ -1138,13 +1136,26 @@ WallscanSampler::WallscanSampler(int y1, float swal, double yrepeat, fixed_t xof const uint32_t *pixels = texture->GetPixelsBgra() + mipmap_offset; - int tx0 = ((xoffset - FRACUNIT / 2) >> FRACBITS) % mip_width; - if (tx0 < 0) - tx0 += mip_width; - int tx1 = (tx0 + 1) % mip_width; - source = (BYTE*)(pixels + tx0 * mip_height); - source2 = (BYTE*)(pixels + tx1 * mip_height); - texturefracx = ((xoffset + FRACUNIT / 2) >> (FRACBITS - 4)) & 15; + bool filter_nearest = (magnifying && !r_magfilter_linear) || (!magnifying && !r_minfilter_linear); + if (filter_nearest) + { + int tx = (xoffset >> FRACBITS) % mip_width; + if (tx < 0) + tx += mip_width; + source = (BYTE*)(pixels + tx * mip_height); + source2 = nullptr; + texturefracx = 0; + } + else + { + int tx0 = ((xoffset - FRACUNIT / 2) >> FRACBITS) % mip_width; + if (tx0 < 0) + tx0 += mip_width; + int tx1 = (tx0 + 1) % mip_width; + source = (BYTE*)(pixels + tx0 * mip_height); + source2 = (BYTE*)(pixels + tx1 * mip_height); + texturefracx = ((xoffset + FRACUNIT / 2) >> (FRACBITS - 4)) & 15; + } } }