Added gl_lerpimages.
git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@849 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
parent
a952965761
commit
545c635ae4
1 changed files with 153 additions and 14 deletions
|
@ -55,6 +55,7 @@ static int filmtexture;
|
||||||
extern cvar_t gl_nobind;
|
extern cvar_t gl_nobind;
|
||||||
extern cvar_t gl_max_size;
|
extern cvar_t gl_max_size;
|
||||||
extern cvar_t gl_picmip;
|
extern cvar_t gl_picmip;
|
||||||
|
extern cvar_t gl_lerpimages;
|
||||||
extern cvar_t gl_picmip2d;
|
extern cvar_t gl_picmip2d;
|
||||||
extern cvar_t r_drawdisk;
|
extern cvar_t r_drawdisk;
|
||||||
extern cvar_t gl_compress;
|
extern cvar_t gl_compress;
|
||||||
|
@ -2162,6 +2163,144 @@ gltexture_t *GL_MatchTexture (char *identifier, int bits, int width, int height)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void Image_Resample32LerpLine (const qbyte *in, qbyte *out, int inwidth, int outwidth)
|
||||||
|
{
|
||||||
|
int j, xi, oldx = 0, f, fstep, endx, lerp;
|
||||||
|
fstep = (int) (inwidth*65536.0f/outwidth);
|
||||||
|
endx = (inwidth-1);
|
||||||
|
for (j = 0,f = 0;j < outwidth;j++, f += fstep)
|
||||||
|
{
|
||||||
|
xi = f >> 16;
|
||||||
|
if (xi != oldx)
|
||||||
|
{
|
||||||
|
in += (xi - oldx) * 4;
|
||||||
|
oldx = xi;
|
||||||
|
}
|
||||||
|
if (xi < endx)
|
||||||
|
{
|
||||||
|
lerp = f & 0xFFFF;
|
||||||
|
*out++ = (qbyte) ((((in[4] - in[0]) * lerp) >> 16) + in[0]);
|
||||||
|
*out++ = (qbyte) ((((in[5] - in[1]) * lerp) >> 16) + in[1]);
|
||||||
|
*out++ = (qbyte) ((((in[6] - in[2]) * lerp) >> 16) + in[2]);
|
||||||
|
*out++ = (qbyte) ((((in[7] - in[3]) * lerp) >> 16) + in[3]);
|
||||||
|
}
|
||||||
|
else // last pixel of the line has no pixel to lerp to
|
||||||
|
{
|
||||||
|
*out++ = in[0];
|
||||||
|
*out++ = in[1];
|
||||||
|
*out++ = in[2];
|
||||||
|
*out++ = in[3];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//yes, this is lordhavok's code.
|
||||||
|
//superblur away!
|
||||||
|
#define LERPBYTE(i) r = row1[i];out[i] = (qbyte) ((((row2[i] - r) * lerp) >> 16) + r)
|
||||||
|
static void Image_Resample32Lerp(const void *indata, int inwidth, int inheight, void *outdata, int outwidth, int outheight)
|
||||||
|
{
|
||||||
|
int i, j, r, yi, oldy, f, fstep, lerp, endy = (inheight-1), inwidth4 = inwidth*4, outwidth4 = outwidth*4;
|
||||||
|
qbyte *out;
|
||||||
|
const qbyte *inrow;
|
||||||
|
qbyte *tmem, *row1, *row2;
|
||||||
|
|
||||||
|
tmem = row1 = BZ_Malloc(2*(outwidth*4));
|
||||||
|
row2 = row1 + (outwidth * 4);
|
||||||
|
|
||||||
|
out = outdata;
|
||||||
|
fstep = (int) (inheight*65536.0f/outheight);
|
||||||
|
|
||||||
|
inrow = indata;
|
||||||
|
oldy = 0;
|
||||||
|
Image_Resample32LerpLine (inrow, row1, inwidth, outwidth);
|
||||||
|
Image_Resample32LerpLine (inrow + inwidth4, row2, inwidth, outwidth);
|
||||||
|
for (i = 0, f = 0;i < outheight;i++,f += fstep)
|
||||||
|
{
|
||||||
|
yi = f >> 16;
|
||||||
|
if (yi < endy)
|
||||||
|
{
|
||||||
|
lerp = f & 0xFFFF;
|
||||||
|
if (yi != oldy)
|
||||||
|
{
|
||||||
|
inrow = (qbyte *)indata + inwidth4*yi;
|
||||||
|
if (yi == oldy+1)
|
||||||
|
memcpy(row1, row2, outwidth4);
|
||||||
|
else
|
||||||
|
Image_Resample32LerpLine (inrow, row1, inwidth, outwidth);
|
||||||
|
Image_Resample32LerpLine (inrow + inwidth4, row2, inwidth, outwidth);
|
||||||
|
oldy = yi;
|
||||||
|
}
|
||||||
|
j = outwidth - 4;
|
||||||
|
while(j >= 0)
|
||||||
|
{
|
||||||
|
LERPBYTE( 0);
|
||||||
|
LERPBYTE( 1);
|
||||||
|
LERPBYTE( 2);
|
||||||
|
LERPBYTE( 3);
|
||||||
|
LERPBYTE( 4);
|
||||||
|
LERPBYTE( 5);
|
||||||
|
LERPBYTE( 6);
|
||||||
|
LERPBYTE( 7);
|
||||||
|
LERPBYTE( 8);
|
||||||
|
LERPBYTE( 9);
|
||||||
|
LERPBYTE(10);
|
||||||
|
LERPBYTE(11);
|
||||||
|
LERPBYTE(12);
|
||||||
|
LERPBYTE(13);
|
||||||
|
LERPBYTE(14);
|
||||||
|
LERPBYTE(15);
|
||||||
|
out += 16;
|
||||||
|
row1 += 16;
|
||||||
|
row2 += 16;
|
||||||
|
j -= 4;
|
||||||
|
}
|
||||||
|
if (j & 2)
|
||||||
|
{
|
||||||
|
LERPBYTE( 0);
|
||||||
|
LERPBYTE( 1);
|
||||||
|
LERPBYTE( 2);
|
||||||
|
LERPBYTE( 3);
|
||||||
|
LERPBYTE( 4);
|
||||||
|
LERPBYTE( 5);
|
||||||
|
LERPBYTE( 6);
|
||||||
|
LERPBYTE( 7);
|
||||||
|
out += 8;
|
||||||
|
row1 += 8;
|
||||||
|
row2 += 8;
|
||||||
|
}
|
||||||
|
if (j & 1)
|
||||||
|
{
|
||||||
|
LERPBYTE( 0);
|
||||||
|
LERPBYTE( 1);
|
||||||
|
LERPBYTE( 2);
|
||||||
|
LERPBYTE( 3);
|
||||||
|
out += 4;
|
||||||
|
row1 += 4;
|
||||||
|
row2 += 4;
|
||||||
|
}
|
||||||
|
row1 -= outwidth4;
|
||||||
|
row2 -= outwidth4;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (yi != oldy)
|
||||||
|
{
|
||||||
|
inrow = (qbyte *)indata + inwidth4*yi;
|
||||||
|
if (yi == oldy+1)
|
||||||
|
memcpy(row1, row2, outwidth4);
|
||||||
|
else
|
||||||
|
Image_Resample32LerpLine (inrow, row1, inwidth, outwidth);
|
||||||
|
oldy = yi;
|
||||||
|
}
|
||||||
|
memcpy(out, row1, outwidth4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BZ_Free(tmem);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
================
|
================
|
||||||
GL_ResampleTexture
|
GL_ResampleTexture
|
||||||
|
@ -2173,12 +2312,25 @@ void GL_ResampleTexture (unsigned *in, int inwidth, int inheight, unsigned *out,
|
||||||
unsigned *inrow;
|
unsigned *inrow;
|
||||||
unsigned frac, fracstep;
|
unsigned frac, fracstep;
|
||||||
|
|
||||||
|
if (gl_lerpimages.value)
|
||||||
|
{
|
||||||
|
Image_Resample32Lerp(in, inwidth, inheight, out, outwidth, outheight);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
fracstep = inwidth*0x10000/outwidth;
|
fracstep = inwidth*0x10000/outwidth;
|
||||||
for (i=0 ; i<outheight ; i++, out += outwidth)
|
for (i=0 ; i<outheight ; i++, out += outwidth)
|
||||||
{
|
{
|
||||||
inrow = in + inwidth*(i*inheight/outheight);
|
inrow = in + inwidth*(i*inheight/outheight);
|
||||||
frac = fracstep >> 1;
|
frac = fracstep >> 1;
|
||||||
for (j=0 ; j<outwidth ; j+=4)
|
j=outwidth-4;
|
||||||
|
while (j&3)
|
||||||
|
{
|
||||||
|
out[j] = inrow[frac>>16];
|
||||||
|
frac += fracstep;
|
||||||
|
j--;
|
||||||
|
}
|
||||||
|
for ( ; j>=0 ; j-=4)
|
||||||
{
|
{
|
||||||
out[j] = inrow[frac>>16];
|
out[j] = inrow[frac>>16];
|
||||||
frac += fracstep;
|
frac += fracstep;
|
||||||
|
@ -2468,18 +2620,6 @@ void GL_Upload32 (char *name, unsigned *data, int width, int height, qboolean m
|
||||||
if (gl_config.arb_texture_compression && gl_compress.value && name&&mipmap)
|
if (gl_config.arb_texture_compression && gl_compress.value && name&&mipmap)
|
||||||
samples = alpha ? GL_COMPRESSED_RGBA_ARB : GL_COMPRESSED_RGB_ARB;
|
samples = alpha ? GL_COMPRESSED_RGBA_ARB : GL_COMPRESSED_RGB_ARB;
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (mipmap)
|
|
||||||
gluBuild2DMipmaps (GL_TEXTURE_2D, samples, width, height, GL_RGBA, GL_UNSIGNED_BYTE, trans);
|
|
||||||
else if (scaled_width == width && scaled_height == height)
|
|
||||||
glTexImage2D (GL_TEXTURE_2D, 0, samples, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, trans);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gluScaleImage (GL_RGBA, width, height, GL_UNSIGNED_BYTE, trans,
|
|
||||||
scaled_width, scaled_height, GL_UNSIGNED_BYTE, scaled);
|
|
||||||
glTexImage2D (GL_TEXTURE_2D, 0, samples, scaled_width, scaled_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, scaled);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
texels += scaled_width * scaled_height;
|
texels += scaled_width * scaled_height;
|
||||||
|
|
||||||
if (gl_config.sgis_generate_mipmap&&mipmap)
|
if (gl_config.sgis_generate_mipmap&&mipmap)
|
||||||
|
@ -2575,7 +2715,6 @@ texels += scaled_width * scaled_height;
|
||||||
done:
|
done:
|
||||||
if (gl_config.sgis_generate_mipmap&&mipmap)
|
if (gl_config.sgis_generate_mipmap&&mipmap)
|
||||||
qglTexParameterf(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_FALSE);
|
qglTexParameterf(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_FALSE);
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
if (mipmap)
|
if (mipmap)
|
||||||
|
|
Loading…
Reference in a new issue