X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=gl_textures.c;h=a9a8de183c107e673db0983151375fad8efe6789;hb=f4f603c440bc0a0a2dcb774fdcb93dd9ac7df9f9;hp=e5b084fe033d88ed202a8ccbec6e8ee1c3218a46;hpb=ef8b163b10f056e8738e4332815ed65487d0fb10;p=xonotic%2Fdarkplaces.git diff --git a/gl_textures.c b/gl_textures.c index e5b084fe..a9a8de18 100644 --- a/gl_textures.c +++ b/gl_textures.c @@ -60,8 +60,8 @@ static textypeinfo_t textype_bgra = {TEXTYPE_BGRA , 4, 4, 4. static textypeinfo_t textype_bgra_alpha = {TEXTYPE_BGRA , 4, 4, 4.0f, GL_BGRA , 4, GL_UNSIGNED_BYTE}; static textypeinfo_t textype_bgra_compress = {TEXTYPE_BGRA , 4, 4, 0.5f, GL_BGRA , GL_COMPRESSED_RGB_ARB, GL_UNSIGNED_BYTE}; static textypeinfo_t textype_bgra_alpha_compress = {TEXTYPE_BGRA , 4, 4, 1.0f, GL_BGRA , GL_COMPRESSED_RGBA_ARB, GL_UNSIGNED_BYTE}; -static textypeinfo_t textype_shadowmap = {TEXTYPE_SHADOWMAP,4,4, 4.0f, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT24_ARB, GL_UNSIGNED_INT}; -static textypeinfo_t textype_projection = {TEXTYPE_PROJECTION,4,4,4.0f, GL_LUMINANCE_ALPHA, GL_LUMINANCE16_ALPHA16, GL_UNSIGNED_SHORT}; +static textypeinfo_t textype_shadowmap16 = {TEXTYPE_SHADOWMAP,2,2, 2.0f, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT16_ARB, GL_UNSIGNED_SHORT}; +static textypeinfo_t textype_shadowmap24 = {TEXTYPE_SHADOWMAP,4,4, 4.0f, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT24_ARB, GL_UNSIGNED_INT}; typedef enum gltexturetype_e { @@ -218,9 +218,7 @@ static textypeinfo_t *R_GetTexTypeInfo(textype_t textype, int flags) case TEXTYPE_BGRA: return &textype_bgra; case TEXTYPE_SHADOWMAP: - return &textype_shadowmap; - case TEXTYPE_PROJECTION: - return &textype_projection; + return (flags & TEXF_LOWPRECISION) ? &textype_shadowmap16 : &textype_shadowmap24; default: Host_Error("R_GetTexTypeInfo: unknown texture format"); return NULL; @@ -785,17 +783,19 @@ static void GL_SetupTextureParameters(int flags, textype_t textype, int texturet if (textype == TEXTYPE_SHADOWMAP) { - if (flags & TEXF_COMPARE) + if (gl_support_arb_shadow) { - qglTexParameteri(textureenum, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);CHECKGLERROR + if (flags & TEXF_COMPARE) + { + qglTexParameteri(textureenum, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);CHECKGLERROR + } + else + { + qglTexParameteri(textureenum, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);CHECKGLERROR + } qglTexParameteri(textureenum, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);CHECKGLERROR } - else - { - qglTexParameteri(textureenum, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);CHECKGLERROR - qglTexParameteri(textureenum, GL_TEXTURE_COMPARE_FUNC_ARB, GL_ALWAYS);CHECKGLERROR - } - qglTexParameteri(textureenum, GL_DEPTH_TEXTURE_MODE_ARB, GL_INTENSITY);CHECKGLERROR + qglTexParameteri(textureenum, GL_DEPTH_TEXTURE_MODE_ARB, GL_LUMINANCE);CHECKGLERROR } CHECKGLERROR @@ -1064,7 +1064,6 @@ static rtexture_t *R_SetupTexture(rtexturepool_t *rtexturepool, const char *iden } break; case TEXTYPE_SHADOWMAP: - case TEXTYPE_PROJECTION: break; default: Host_Error("R_LoadTexture: unknown texture type"); @@ -1132,53 +1131,31 @@ rtexture_t *R_LoadTextureCubeMap(rtexturepool_t *rtexturepool, const char *ident return R_SetupTexture(rtexturepool, identifier, width, width, 1, 6, flags, textype, GLTEXTURETYPE_CUBEMAP, data, palette); } -rtexture_t *R_LoadTextureShadowMapRectangle(rtexturepool_t *rtexturepool, const char *identifier, int width, int height, qboolean filter) +static int R_ShadowMapTextureFlags(int precision, qboolean filter) { - return R_SetupTexture(rtexturepool, identifier, width, height, 1, 1, TEXF_ALWAYSPRECACHE | TEXF_CLAMP | (filter ? TEXF_FORCELINEAR | TEXF_COMPARE : TEXF_FORCENEAREST), TEXTYPE_SHADOWMAP, GLTEXTURETYPE_RECTANGLE, NULL, NULL); + int flags = TEXF_ALWAYSPRECACHE | TEXF_CLAMP; + if (filter) + flags |= TEXF_FORCELINEAR | TEXF_COMPARE; + else + flags |= TEXF_FORCENEAREST; + if (precision <= 16) + flags |= TEXF_LOWPRECISION; + return flags; } -rtexture_t *R_LoadTextureShadowMap2D(rtexturepool_t *rtexturepool, const char *identifier, int width, int height, qboolean filter) +rtexture_t *R_LoadTextureShadowMapRectangle(rtexturepool_t *rtexturepool, const char *identifier, int width, int height, int precision, qboolean filter) { - return R_SetupTexture(rtexturepool, identifier, width, height, 1, 1, TEXF_ALWAYSPRECACHE | TEXF_CLAMP | (filter ? TEXF_FORCELINEAR | TEXF_COMPARE : TEXF_FORCENEAREST), TEXTYPE_SHADOWMAP, GLTEXTURETYPE_2D, NULL, NULL); + return R_SetupTexture(rtexturepool, identifier, width, height, 1, 1, R_ShadowMapTextureFlags(precision, filter), TEXTYPE_SHADOWMAP, GLTEXTURETYPE_RECTANGLE, NULL, NULL); } -rtexture_t *R_LoadTextureShadowMapCube(rtexturepool_t *rtexturepool, const char *identifier, int width, qboolean filter) +rtexture_t *R_LoadTextureShadowMap2D(rtexturepool_t *rtexturepool, const char *identifier, int width, int height, int precision, qboolean filter) { - return R_SetupTexture(rtexturepool, identifier, width, width, 1, 6, TEXF_ALWAYSPRECACHE | TEXF_CLAMP | (filter ? TEXF_FORCELINEAR | TEXF_COMPARE : TEXF_FORCENEAREST), TEXTYPE_SHADOWMAP, GLTEXTURETYPE_CUBEMAP, NULL, NULL); + return R_SetupTexture(rtexturepool, identifier, width, height, 1, 1, R_ShadowMapTextureFlags(precision, filter), TEXTYPE_SHADOWMAP, GLTEXTURETYPE_2D, NULL, NULL); } -rtexture_t *R_LoadTextureCubeProjection(rtexturepool_t *rtexturepool, const char *identifier, int width, int height, int size, int border) +rtexture_t *R_LoadTextureShadowMapCube(rtexturepool_t *rtexturepool, const char *identifier, int width, int precision, qboolean filter) { - // maps to a 2x3 texture rectangle with normalized coordinates (must be scaled by size after lookup) - // +- - // XX - // YY - // ZZ - rtexture_t *projection; - unsigned short *data, *texel; - unsigned int sizebits = 0, stepbits = 0, res, i, j, k; - while ((1 << sizebits) < size) sizebits++; - while ((1 << stepbits) <= border) stepbits++; - stepbits = min(stepbits, sizebits); - res = size>>stepbits; - stepbits += 16 - sizebits - 1; - data = (unsigned short *)Mem_Alloc(texturemempool, 2*sizeof(unsigned short)*res*res*6); - texel = data; - for (i = 0;i < 6;i++) - { - unsigned int x = (i%2)<<16, y = (i/2)<<16; - for (j = 0;j < res;j++) - { - for (k = 0;k < res;k++) - { - *texel++ = (x + ((2*k + 1)<