mirror of
https://github.com/holub/mame
synced 2025-05-29 00:53:09 +03:00
Added bilinear filtering to Naomi video emulation. Textures are still a bit crawly since we're always using the lowest MIP level. [MooglyGuy]
This commit is contained in:
parent
09d58a6c7f
commit
5932d858db
@ -50,7 +50,7 @@ static void testdrawscreen(const running_machine *machine,bitmap_t *bitmap,const
|
||||
|
||||
typedef struct texinfo {
|
||||
UINT32 address, vqbase;
|
||||
int sizex, sizey, sizes, pf, palette, mode, mipmapped, blend_mode;
|
||||
int sizex, sizey, sizes, pf, palette, mode, mipmapped, blend_mode, filter_mode, flip_u, flip_v;
|
||||
|
||||
UINT32 (*r)(struct texinfo *t, float x, float y);
|
||||
UINT32 (*blend)(UINT32 s, UINT32 d);
|
||||
@ -98,8 +98,54 @@ typedef struct {
|
||||
UINT32 depthcomparemode,cullingmode,zwritedisable,cachebypass,dcalcctrl,volumeinstruction,mipmapped,vqcompressed,strideselect,paletteselector;
|
||||
} pvrta_state;
|
||||
|
||||
enum
|
||||
{
|
||||
TEX_FILTER_NEAREST = 0,
|
||||
TEX_FILTER_BILINEAR,
|
||||
TEX_FILTER_TRILINEAR_A,
|
||||
TEX_FILTER_TRILINEAR_B
|
||||
};
|
||||
|
||||
static pvrta_state state_ta;
|
||||
|
||||
// Perform a standard bilinear filter across four pixels
|
||||
INLINE INT32 clamp(INT32 in, INT32 min, INT32 max)
|
||||
{
|
||||
if(in < min) return min;
|
||||
if(in > max) return max;
|
||||
return in;
|
||||
}
|
||||
|
||||
INLINE UINT32 bilinear_filter(UINT32 c0, UINT32 c1, UINT32 c2, UINT32 c3, float u, float v)
|
||||
{
|
||||
float u_ratio = (float)((float)u - (int)u);
|
||||
float v_ratio = (float)((float)v - (int)v);
|
||||
float u_opposite = 1.0f - u_ratio;
|
||||
float v_opposite = 1.0f - v_ratio;
|
||||
UINT32 channel = 0;
|
||||
UINT32 out = 0;
|
||||
if(u < 0.0f)
|
||||
{
|
||||
u_opposite = 0.0f - u_ratio;
|
||||
u_ratio = 1.0f + u_ratio;
|
||||
}
|
||||
if(v < 0.0f)
|
||||
{
|
||||
v_opposite = 0.0f - v_ratio;
|
||||
v_ratio = 1.0f + v_ratio;
|
||||
}
|
||||
for(channel = 0; channel < 4; channel++)
|
||||
{
|
||||
INT32 p0 = (c0 >> (channel << 3)) & 0x000000ff;
|
||||
INT32 p1 = (c1 >> (channel << 3)) & 0x000000ff;
|
||||
INT32 p2 = (c2 >> (channel << 3)) & 0x000000ff;
|
||||
INT32 p3 = (c3 >> (channel << 3)) & 0x000000ff;
|
||||
out |= (UINT8)clamp((p0 * u_opposite + p1 * u_ratio) * v_opposite +
|
||||
(p3 * u_opposite + p2 * u_ratio) * v_ratio, 0, 255) << (channel << 3);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
// Multiply with alpha value in bits 31-24
|
||||
INLINE UINT32 bla(UINT32 c, UINT32 a)
|
||||
{
|
||||
@ -566,6 +612,9 @@ static void tex_get_info(texinfo *t, pvrta_state *sa)
|
||||
t->mipmapped = sa->mipmapped;
|
||||
t->palette = sa->paletteselector;
|
||||
t->blend_mode = sa->blend_mode;
|
||||
t->filter_mode = sa->filtermode;
|
||||
t->flip_u = (sa->flipuv >> 1) & 1;
|
||||
t->flip_v = sa->flipuv & 1;
|
||||
|
||||
t->r = tex_r_default;
|
||||
t->cd = dilatechose[t->sizes];
|
||||
@ -1531,7 +1580,25 @@ void render_hline(bitmap_t *bitmap, texinfo *ti, int y, float xl, float xr, floa
|
||||
float u = ul/wl;
|
||||
float v = vl/wl;
|
||||
|
||||
/*
|
||||
if(ti->flip_u)
|
||||
{
|
||||
u = ti->sizex - u;
|
||||
}
|
||||
|
||||
if(ti->flip_v)
|
||||
{
|
||||
v = ti->sizey - v;
|
||||
}*/
|
||||
|
||||
c = ti->r(ti, u, v);
|
||||
if(ti->filter_mode == TEX_FILTER_BILINEAR)
|
||||
{
|
||||
UINT32 c1 = ti->r(ti, u+1.0, v);
|
||||
UINT32 c2 = ti->r(ti, u+1.0, v+1.0);
|
||||
UINT32 c3 = ti->r(ti, u, v+1.0);
|
||||
c = bilinear_filter(c, c1, c2, c3, u, v);
|
||||
}
|
||||
|
||||
if(c & 0xff000000) {
|
||||
*tdata = ti->blend(c, *tdata);
|
||||
|
Loading…
Reference in New Issue
Block a user