diff --git a/ref/common/ref_common.h b/ref/common/ref_common.h index 04b3c064..b7f97508 100644 --- a/ref/common/ref_common.h +++ b/ref/common/ref_common.h @@ -54,6 +54,7 @@ void *_Mem_Realloc( poolhandle_t poolptr, void *memptr, size_t size, qboolean cl extern dlight_t *gp_dlights; extern int g_lightstylevalue[MAX_LIGHTSTYLES]; +extern poolhandle_t r_temppool; // // ref_common cvars @@ -82,5 +83,9 @@ colorVec R_LightVec( const vec3_t start, const vec3_t end, vec3_t lspot, vec3_t colorVec R_LightPoint( const vec3_t p0 ); void R_UpdateSurfaceCachedLight( msurface_t *surf ); +// +// ref_image.c +// +byte *GL_ResampleTexture( const byte *source, int in_w, int in_h, int out_w, int out_h, qboolean isNormalMap ); #endif // REF_COMMON_H diff --git a/ref/common/ref_context.c b/ref/common/ref_context.c index 8c4e78f9..a3d29719 100644 --- a/ref/common/ref_context.c +++ b/ref/common/ref_context.c @@ -25,6 +25,7 @@ ref_host_t *gp_host; uint16_t rtable[MOD_FRAMES][MOD_FRAMES]; dlight_t *gp_dlights; int g_lightstylevalue[MAX_LIGHTSTYLES]; +poolhandle_t r_temppool; void _Mem_Free( void *data, const char *filename, int fileline ) { diff --git a/ref/common/ref_image.c b/ref/common/ref_image.c new file mode 100644 index 00000000..fa6de171 --- /dev/null +++ b/ref/common/ref_image.c @@ -0,0 +1,108 @@ +/* +ref_image.c - shared image code +Copyright (C) 2010 Uncle Mike + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. +*/ + +#include "ref_common.h" +#include "xash3d_mathlib.h" + +/* +================ +GL_ResampleTexture + +Assume input buffer is RGBA +================= +*/ +byte *GL_ResampleTexture( const byte *source, int inWidth, int inHeight, int outWidth, int outHeight, qboolean isNormalMap ) +{ + uint frac, fracStep; + uint *in = (uint *)source; + uint p1[0x1000], p2[0x1000]; + byte *pix1, *pix2, *pix3, *pix4; + uint *out, *inRow1, *inRow2; + static byte *scaledImage = NULL; // pointer to a scaled image + vec3_t normal; + int i, x, y; + + if( !source ) return NULL; + + scaledImage = Mem_Realloc( r_temppool, scaledImage, outWidth * outHeight * 4 ); + fracStep = inWidth * 0x10000 / outWidth; + out = (uint *)scaledImage; + + frac = fracStep >> 2; + for( i = 0; i < outWidth; i++ ) + { + p1[i] = 4 * (frac >> 16); + frac += fracStep; + } + + frac = (fracStep >> 2) * 3; + for( i = 0; i < outWidth; i++ ) + { + p2[i] = 4 * (frac >> 16); + frac += fracStep; + } + + if( isNormalMap ) + { + for( y = 0; y < outHeight; y++, out += outWidth ) + { + inRow1 = in + inWidth * (int)(((float)y + 0.25f) * inHeight / outHeight); + inRow2 = in + inWidth * (int)(((float)y + 0.75f) * inHeight / outHeight); + + for( x = 0; x < outWidth; x++ ) + { + pix1 = (byte *)inRow1 + p1[x]; + pix2 = (byte *)inRow1 + p2[x]; + pix3 = (byte *)inRow2 + p1[x]; + pix4 = (byte *)inRow2 + p2[x]; + + normal[0] = MAKE_SIGNED( pix1[0] ) + MAKE_SIGNED( pix2[0] ) + MAKE_SIGNED( pix3[0] ) + MAKE_SIGNED( pix4[0] ); + normal[1] = MAKE_SIGNED( pix1[1] ) + MAKE_SIGNED( pix2[1] ) + MAKE_SIGNED( pix3[1] ) + MAKE_SIGNED( pix4[1] ); + normal[2] = MAKE_SIGNED( pix1[2] ) + MAKE_SIGNED( pix2[2] ) + MAKE_SIGNED( pix3[2] ) + MAKE_SIGNED( pix4[2] ); + + if( !VectorNormalizeLength( normal )) + VectorSet( normal, 0.5f, 0.5f, 1.0f ); + + ((byte *)(out+x))[0] = 128 + (byte)(127.0f * normal[0]); + ((byte *)(out+x))[1] = 128 + (byte)(127.0f * normal[1]); + ((byte *)(out+x))[2] = 128 + (byte)(127.0f * normal[2]); + ((byte *)(out+x))[3] = 255; + } + } + } + else + { + for( y = 0; y < outHeight; y++, out += outWidth ) + { + inRow1 = in + inWidth * (int)(((float)y + 0.25f) * inHeight / outHeight); + inRow2 = in + inWidth * (int)(((float)y + 0.75f) * inHeight / outHeight); + + for( x = 0; x < outWidth; x++ ) + { + pix1 = (byte *)inRow1 + p1[x]; + pix2 = (byte *)inRow1 + p2[x]; + pix3 = (byte *)inRow2 + p1[x]; + pix4 = (byte *)inRow2 + p2[x]; + + ((byte *)(out+x))[0] = (pix1[0] + pix2[0] + pix3[0] + pix4[0]) >> 2; + ((byte *)(out+x))[1] = (pix1[1] + pix2[1] + pix3[1] + pix4[1]) >> 2; + ((byte *)(out+x))[2] = (pix1[2] + pix2[2] + pix3[2] + pix4[2]) >> 2; + ((byte *)(out+x))[3] = (pix1[3] + pix2[3] + pix3[3] + pix4[3]) >> 2; + } + } + } + + return scaledImage; +} diff --git a/ref/gl/gl_image.c b/ref/gl/gl_image.c index f5f89275..ff3b95ac 100644 --- a/ref/gl/gl_image.c +++ b/ref/gl/gl_image.c @@ -691,97 +691,6 @@ static void GL_SetTextureFormat( gl_texture_t *tex, pixformat_t format, int chan } } -/* -================= -GL_ResampleTexture - -Assume input buffer is RGBA -================= -*/ -byte *GL_ResampleTexture( const byte *source, int inWidth, int inHeight, int outWidth, int outHeight, qboolean isNormalMap ) -{ - uint frac, fracStep; - uint *in = (uint *)source; - uint p1[0x1000], p2[0x1000]; - byte *pix1, *pix2, *pix3, *pix4; - uint *out, *inRow1, *inRow2; - static byte *scaledImage = NULL; // pointer to a scaled image - vec3_t normal; - int i, x, y; - - if( !source ) return NULL; - - scaledImage = Mem_Realloc( r_temppool, scaledImage, outWidth * outHeight * 4 ); - fracStep = inWidth * 0x10000 / outWidth; - out = (uint *)scaledImage; - - frac = fracStep >> 2; - for( i = 0; i < outWidth; i++ ) - { - p1[i] = 4 * (frac >> 16); - frac += fracStep; - } - - frac = (fracStep >> 2) * 3; - for( i = 0; i < outWidth; i++ ) - { - p2[i] = 4 * (frac >> 16); - frac += fracStep; - } - - if( isNormalMap ) - { - for( y = 0; y < outHeight; y++, out += outWidth ) - { - inRow1 = in + inWidth * (int)(((float)y + 0.25f) * inHeight / outHeight); - inRow2 = in + inWidth * (int)(((float)y + 0.75f) * inHeight / outHeight); - - for( x = 0; x < outWidth; x++ ) - { - pix1 = (byte *)inRow1 + p1[x]; - pix2 = (byte *)inRow1 + p2[x]; - pix3 = (byte *)inRow2 + p1[x]; - pix4 = (byte *)inRow2 + p2[x]; - - normal[0] = MAKE_SIGNED( pix1[0] ) + MAKE_SIGNED( pix2[0] ) + MAKE_SIGNED( pix3[0] ) + MAKE_SIGNED( pix4[0] ); - normal[1] = MAKE_SIGNED( pix1[1] ) + MAKE_SIGNED( pix2[1] ) + MAKE_SIGNED( pix3[1] ) + MAKE_SIGNED( pix4[1] ); - normal[2] = MAKE_SIGNED( pix1[2] ) + MAKE_SIGNED( pix2[2] ) + MAKE_SIGNED( pix3[2] ) + MAKE_SIGNED( pix4[2] ); - - if( !VectorNormalizeLength( normal )) - VectorSet( normal, 0.5f, 0.5f, 1.0f ); - - ((byte *)(out+x))[0] = 128 + (byte)(127.0f * normal[0]); - ((byte *)(out+x))[1] = 128 + (byte)(127.0f * normal[1]); - ((byte *)(out+x))[2] = 128 + (byte)(127.0f * normal[2]); - ((byte *)(out+x))[3] = 255; - } - } - } - else - { - for( y = 0; y < outHeight; y++, out += outWidth ) - { - inRow1 = in + inWidth * (int)(((float)y + 0.25f) * inHeight / outHeight); - inRow2 = in + inWidth * (int)(((float)y + 0.75f) * inHeight / outHeight); - - for( x = 0; x < outWidth; x++ ) - { - pix1 = (byte *)inRow1 + p1[x]; - pix2 = (byte *)inRow1 + p2[x]; - pix3 = (byte *)inRow2 + p1[x]; - pix4 = (byte *)inRow2 + p2[x]; - - ((byte *)(out+x))[0] = (pix1[0] + pix2[0] + pix3[0] + pix4[0]) >> 2; - ((byte *)(out+x))[1] = (pix1[1] + pix2[1] + pix3[1] + pix4[1]) >> 2; - ((byte *)(out+x))[2] = (pix1[2] + pix2[2] + pix3[2] + pix4[2]) >> 2; - ((byte *)(out+x))[3] = (pix1[3] + pix2[3] + pix3[3] + pix4[3]) >> 2; - } - } - } - - return scaledImage; -} - /* ================= GL_BoxFilter3x3 diff --git a/ref/gl/gl_local.h b/ref/gl/gl_local.h index a04c8833..b4ac9294 100644 --- a/ref/gl/gl_local.h +++ b/ref/gl/gl_local.h @@ -54,7 +54,6 @@ void VGL_ShimEndFrame( void ); #define LM_SAMPLE_SIZE 16 -extern poolhandle_t r_temppool; #define BLOCK_SIZE tr.block_size // lightmap blocksize #define BLOCK_SIZE_DEFAULT 128 // for keep backward compatibility @@ -351,7 +350,6 @@ gl_texture_t *R_GetTexture( unsigned int texnum ); int GL_LoadTexture( const char *name, const byte *buf, size_t size, int flags ); int GL_LoadTextureArray( const char **names, int flags ); int GL_LoadTextureFromBuffer( const char *name, rgbdata_t *pic, texFlags_t flags, qboolean update ); -byte *GL_ResampleTexture( const byte *source, int in_w, int in_h, int out_w, int out_h, qboolean isNormalMap ); int GL_CreateTexture( const char *name, int width, int height, const void *buffer, texFlags_t flags ); int GL_CreateTextureArray( const char *name, int width, int height, int depth, const void *buffer, texFlags_t flags ); void GL_ProcessTexture( int texnum, float gamma, int topColor, int bottomColor ); diff --git a/ref/gl/gl_opengl.c b/ref/gl/gl_opengl.c index 8254daf7..b48c5bb2 100644 --- a/ref/gl/gl_opengl.c +++ b/ref/gl/gl_opengl.c @@ -40,8 +40,6 @@ CVAR_DEFINE_AUTO( r_ripple_spawntime, "0.1", FCVAR_GLCONFIG, "how fast new rippl CVAR_DEFINE_AUTO( r_large_lightmaps, "0", FCVAR_GLCONFIG|FCVAR_LATCH, "enable larger lightmap atlas textures (might break custom renderer mods)" ); -poolhandle_t r_temppool; - gl_globals_t tr; glconfig_t glConfig; glstate_t glState; diff --git a/ref/soft/r_context.c b/ref/soft/r_context.c index b500c9c8..47326431 100644 --- a/ref/soft/r_context.c +++ b/ref/soft/r_context.c @@ -17,7 +17,6 @@ GNU General Public License for more details. gl_globals_t tr; ref_speeds_t r_stats; -poolhandle_t r_temppool; viddef_t vid; diff --git a/ref/soft/r_image.c b/ref/soft/r_image.c index c08b74ff..38e6182a 100644 --- a/ref/soft/r_image.c +++ b/ref/soft/r_image.c @@ -115,98 +115,6 @@ static void GL_SetTextureDimensions( image_t *tex, int width, int height, int de tex->depth = Q_max( 1, depth ); } -/* -================= -GL_ResampleTexture - -Assume input buffer is RGBA -================= -*/ -byte *GL_ResampleTexture( const byte *source, int inWidth, int inHeight, int outWidth, int outHeight, qboolean isNormalMap ) -{ - uint frac, fracStep; - uint *in = (uint *)source; - uint p1[0x1000], p2[0x1000]; - byte *pix1, *pix2, *pix3, *pix4; - uint *out, *inRow1, *inRow2; - static byte *scaledImage = NULL; // pointer to a scaled image - vec3_t normal; - int i, x, y; - - if( !source ) - return NULL; - - scaledImage = Mem_Realloc( r_temppool, scaledImage, outWidth * outHeight * 4 ); - fracStep = inWidth * 0x10000 / outWidth; - out = (uint *)scaledImage; - - frac = fracStep >> 2; - for( i = 0; i < outWidth; i++ ) - { - p1[i] = 4 * ( frac >> 16 ); - frac += fracStep; - } - - frac = ( fracStep >> 2 ) * 3; - for( i = 0; i < outWidth; i++ ) - { - p2[i] = 4 * ( frac >> 16 ); - frac += fracStep; - } - - if( isNormalMap ) - { - for( y = 0; y < outHeight; y++, out += outWidth ) - { - inRow1 = in + inWidth * (int)(((float)y + 0.25f ) * inHeight / outHeight ); - inRow2 = in + inWidth * (int)(((float)y + 0.75f ) * inHeight / outHeight ); - - for( x = 0; x < outWidth; x++ ) - { - pix1 = (byte *)inRow1 + p1[x]; - pix2 = (byte *)inRow1 + p2[x]; - pix3 = (byte *)inRow2 + p1[x]; - pix4 = (byte *)inRow2 + p2[x]; - - normal[0] = MAKE_SIGNED( pix1[0] ) + MAKE_SIGNED( pix2[0] ) + MAKE_SIGNED( pix3[0] ) + MAKE_SIGNED( pix4[0] ); - normal[1] = MAKE_SIGNED( pix1[1] ) + MAKE_SIGNED( pix2[1] ) + MAKE_SIGNED( pix3[1] ) + MAKE_SIGNED( pix4[1] ); - normal[2] = MAKE_SIGNED( pix1[2] ) + MAKE_SIGNED( pix2[2] ) + MAKE_SIGNED( pix3[2] ) + MAKE_SIGNED( pix4[2] ); - - if( !VectorNormalizeLength( normal )) - VectorSet( normal, 0.5f, 0.5f, 1.0f ); - - ((byte *)( out + x ))[0] = 128 + (byte)( 127.0f * normal[0] ); - ((byte *)( out + x ))[1] = 128 + (byte)( 127.0f * normal[1] ); - ((byte *)( out + x ))[2] = 128 + (byte)( 127.0f * normal[2] ); - ((byte *)( out + x ))[3] = 255; - } - } - } - else - { - for( y = 0; y < outHeight; y++, out += outWidth ) - { - inRow1 = in + inWidth * (int)(((float)y + 0.25f ) * inHeight / outHeight ); - inRow2 = in + inWidth * (int)(((float)y + 0.75f ) * inHeight / outHeight ); - - for( x = 0; x < outWidth; x++ ) - { - pix1 = (byte *)inRow1 + p1[x]; - pix2 = (byte *)inRow1 + p2[x]; - pix3 = (byte *)inRow2 + p1[x]; - pix4 = (byte *)inRow2 + p2[x]; - - ((byte *)( out + x ))[0] = ( pix1[0] + pix2[0] + pix3[0] + pix4[0] ) >> 2; - ((byte *)( out + x ))[1] = ( pix1[1] + pix2[1] + pix3[1] + pix4[1] ) >> 2; - ((byte *)( out + x ))[2] = ( pix1[2] + pix2[2] + pix3[2] + pix4[2] ) >> 2; - ((byte *)( out + x ))[3] = ( pix1[3] + pix2[3] + pix3[3] + pix4[3] ) >> 2; - } - } - } - - return scaledImage; -} - /* ================= GL_BuildMipMap diff --git a/ref/soft/r_local.h b/ref/soft/r_local.h index ca60f6bf..19861216 100644 --- a/ref/soft/r_local.h +++ b/ref/soft/r_local.h @@ -38,8 +38,6 @@ typedef int fixed16_t; // make mod_ref.h? #define LM_SAMPLE_SIZE 16 -extern poolhandle_t r_temppool; - #define BLOCK_SIZE tr.block_size // lightmap blocksize #define BLOCK_SIZE_DEFAULT 128 // for keep backward compatibility #define BLOCK_SIZE_MAX 1024 @@ -367,7 +365,6 @@ image_t *R_GetTexture( unsigned int texnum ); int GL_LoadTexture( const char *name, const byte *buf, size_t size, int flags ); int GL_LoadTextureArray( const char **names, int flags ); int GL_LoadTextureFromBuffer( const char *name, rgbdata_t *pic, texFlags_t flags, qboolean update ); -byte *GL_ResampleTexture( const byte *source, int in_w, int in_h, int out_w, int out_h, qboolean isNormalMap ); int GL_CreateTexture( const char *name, int width, int height, const void *buffer, texFlags_t flags ); int GL_CreateTextureArray( const char *name, int width, int height, int depth, const void *buffer, texFlags_t flags ); void GL_ProcessTexture( int texnum, float gamma, int topColor, int bottomColor );