mirror of
https://github.com/DrBeef/ioq3quest.git
synced 2024-11-10 14:52:00 +00:00
OpenGL2: Replace R_MipMapsRGB() with faster version.
This commit is contained in:
parent
48738599a0
commit
3d01543e2c
2 changed files with 42 additions and 37 deletions
|
@ -56,9 +56,6 @@ void Mat4SimpleInverse( const mat4_t in, mat4_t out);
|
||||||
#define ByteToFloat(a) ((float)(a) * 1.0f/255.0f)
|
#define ByteToFloat(a) ((float)(a) * 1.0f/255.0f)
|
||||||
#define FloatToByte(a) (byte)((a) * 255.0f)
|
#define FloatToByte(a) (byte)((a) * 255.0f)
|
||||||
|
|
||||||
#define RGBtosRGB(a) (((a) < 0.0031308f) ? (12.92f * (a)) : (1.055f * pow((a), 0.41666f) - 0.055f))
|
|
||||||
#define sRGBtoRGB(a) (((a) <= 0.04045f) ? ((a) / 12.92f) : (pow((((a) + 0.055f) / 1.055f), 2.4)) )
|
|
||||||
|
|
||||||
static ID_INLINE int VectorCompare4(const vec4_t v1, const vec4_t v2)
|
static ID_INLINE int VectorCompare4(const vec4_t v1, const vec4_t v2)
|
||||||
{
|
{
|
||||||
if(v1[0] != v2[0] || v1[1] != v2[1] || v1[2] != v2[2] || v1[3] != v2[3])
|
if(v1[0] != v2[0] || v1[1] != v2[1] || v1[2] != v2[2] || v1[3] != v2[3])
|
||||||
|
|
|
@ -1332,43 +1332,51 @@ static void R_MipMap2( byte *in, int inWidth, int inHeight ) {
|
||||||
|
|
||||||
static void R_MipMapsRGB( byte *in, int inWidth, int inHeight)
|
static void R_MipMapsRGB( byte *in, int inWidth, int inHeight)
|
||||||
{
|
{
|
||||||
int i, j, k;
|
int x, y, c, stride;
|
||||||
int outWidth, outHeight;
|
const byte *in2;
|
||||||
byte *temp;
|
float total;
|
||||||
|
static float downmipSrgbLookup[256];
|
||||||
|
static int downmipSrgbLookupSet = 0;
|
||||||
|
byte *out = in;
|
||||||
|
|
||||||
outWidth = inWidth >> 1;
|
if (!downmipSrgbLookupSet) {
|
||||||
outHeight = inHeight >> 1;
|
for (x = 0; x < 256; x++)
|
||||||
temp = ri.Hunk_AllocateTempMemory( outWidth * outHeight * 4 );
|
downmipSrgbLookup[x] = ((x < 10) ? x / 3294.6f : powf((x / 255.0f + 0.055f) / 1.055f, 2.4f)) * 0.25f;
|
||||||
|
downmipSrgbLookupSet = 1;
|
||||||
for ( i = 0 ; i < outHeight ; i++ ) {
|
|
||||||
byte *outbyte = temp + ( i * outWidth ) * 4;
|
|
||||||
byte *inbyte1 = in + ( i * 2 * inWidth ) * 4;
|
|
||||||
byte *inbyte2 = in + ( (i * 2 + 1) * inWidth ) * 4;
|
|
||||||
for ( j = 0 ; j < outWidth ; j++ ) {
|
|
||||||
for ( k = 0 ; k < 3 ; k++ ) {
|
|
||||||
float total, current;
|
|
||||||
|
|
||||||
current = ByteToFloat(inbyte1[0]); total = sRGBtoRGB(current);
|
|
||||||
current = ByteToFloat(inbyte1[4]); total += sRGBtoRGB(current);
|
|
||||||
current = ByteToFloat(inbyte2[0]); total += sRGBtoRGB(current);
|
|
||||||
current = ByteToFloat(inbyte2[4]); total += sRGBtoRGB(current);
|
|
||||||
|
|
||||||
total *= 0.25f;
|
|
||||||
|
|
||||||
inbyte1++;
|
|
||||||
inbyte2++;
|
|
||||||
|
|
||||||
current = RGBtosRGB(total);
|
|
||||||
*outbyte++ = FloatToByte(current);
|
|
||||||
}
|
|
||||||
*outbyte++ = (inbyte1[0] + inbyte1[4] + inbyte2[0] + inbyte2[4]) >> 2;
|
|
||||||
inbyte1 += 5;
|
|
||||||
inbyte2 += 5;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Com_Memcpy( in, temp, outWidth * outHeight * 4 );
|
if (inWidth == 1 && inHeight == 1)
|
||||||
ri.Hunk_FreeTempMemory( temp );
|
return;
|
||||||
|
|
||||||
|
if (inWidth == 1 || inHeight == 1) {
|
||||||
|
for (x = (inWidth * inHeight) >> 1; x; x--) {
|
||||||
|
for (c = 3; c; c--, in++) {
|
||||||
|
total = (downmipSrgbLookup[*(in)] + downmipSrgbLookup[*(in + 4)]) * 2.0f;
|
||||||
|
|
||||||
|
*out++ = (byte)(powf(total, 1.0f / 2.2f) * 255.0f);
|
||||||
|
}
|
||||||
|
*out++ = (*(in) + *(in + 4)) >> 1; in += 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
stride = inWidth * 4;
|
||||||
|
inWidth >>= 1; inHeight >>= 1;
|
||||||
|
|
||||||
|
in2 = in + stride;
|
||||||
|
for (y = inHeight; y; y--, in += stride, in2 += stride) {
|
||||||
|
for (x = inWidth; x; x--) {
|
||||||
|
for (c = 3; c; c--, in++, in2++) {
|
||||||
|
total = downmipSrgbLookup[*(in)] + downmipSrgbLookup[*(in + 4)]
|
||||||
|
+ downmipSrgbLookup[*(in2)] + downmipSrgbLookup[*(in2 + 4)];
|
||||||
|
|
||||||
|
*out++ = (byte)(powf(total, 1.0f / 2.2f) * 255.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
*out++ = (*(in) + *(in + 4) + *(in2) + *(in2 + 4)) >> 2; in += 5, in2 += 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue