mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-12-02 00:43:43 +00:00
Added support for more texture filtering control
This commit is contained in:
parent
b7f32d1bfc
commit
8ec420a597
5 changed files with 41 additions and 28 deletions
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue