From 2278c4b5c63fc875d157b5725acd01fc9b1a12e0 Mon Sep 17 00:00:00 2001 From: tomaz Date: Sun, 22 Aug 2004 11:37:47 +0000 Subject: [PATCH] Made gl_picmip affect only maps, models, and sprites by setting their TEXF_PICMIP flag. git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@4356 d7cf8633-e32d-0410-b094-e92efae38249 --- gl_textures.c | 24 +++++++++++++++--------- model_alias.c | 16 ++++++++-------- model_brush.c | 10 +++++----- model_sprite.c | 10 +++++----- 4 files changed, 33 insertions(+), 27 deletions(-) diff --git a/gl_textures.c b/gl_textures.c index b07078ee..149ab888 100644 --- a/gl_textures.c +++ b/gl_textures.c @@ -382,20 +382,23 @@ static void GL_TextureMode_f (void) static int R_CalcTexelDataSize (gltexture_t *glt) { - int width2, height2, depth2, size; + int width2, height2, depth2, size, picmip; if (glt->flags & TEXF_FRAGMENT) size = glt->width * glt->height * glt->depth; else { + picmip = 0; + if (glt->flags & TEXF_PICMIP) + picmip = gl_picmip.integer; if (gl_max_size.integer > realmaxsize) Cvar_SetValue("gl_max_size", realmaxsize); // calculate final size for (width2 = 1;width2 < glt->width;width2 <<= 1); for (height2 = 1;height2 < glt->height;height2 <<= 1); for (depth2 = 1;depth2 < glt->depth;depth2 <<= 1); - for (width2 >>= gl_picmip.integer;width2 > gl_max_size.integer;width2 >>= 1); - for (height2 >>= gl_picmip.integer;height2 > gl_max_size.integer;height2 >>= 1); - for (depth2 >>= gl_picmip.integer;depth2 > gl_max_size.integer;depth2 >>= 1); + for (width2 >>= picmip;width2 > gl_max_size.integer;width2 >>= 1); + for (height2 >>= picmip;height2 > gl_max_size.integer;height2 >>= 1); + for (depth2 >>= picmip;depth2 > gl_max_size.integer;depth2 >>= 1); if (width2 < 1) width2 = 1; if (height2 < 1) height2 = 1; if (depth2 < 1) depth2 = 1; @@ -873,7 +876,7 @@ static void R_Upload(gltexture_t *glt, qbyte *data) static void R_FindImageForTexture(gltexture_t *glt) { - int i, j, best, best2, x, y, z, w, h, d; + int i, j, best, best2, x, y, z, w, h, d, picmip; textypeinfo_t *texinfo; gltexturepool_t *pool; gltextureimage_t *image, **imagechainpointer; @@ -968,15 +971,18 @@ static void R_FindImageForTexture(gltexture_t *glt) image->type = GLIMAGETYPE_TILE; image->blockallocation = NULL; + picmip = 0; + if (glt->flags & TEXF_PICMIP) + picmip = gl_picmip.integer; // calculate final size if (gl_max_size.integer > realmaxsize) Cvar_SetValue("gl_max_size", realmaxsize); for (image->width = 1;image->width < glt->width;image->width <<= 1); for (image->height = 1;image->height < glt->height;image->height <<= 1); for (image->depth = 1;image->depth < glt->depth;image->depth <<= 1); - for (image->width >>= gl_picmip.integer;image->width > gl_max_size.integer;image->width >>= 1); - for (image->height >>= gl_picmip.integer;image->height > gl_max_size.integer;image->height >>= 1); - for (image->depth >>= gl_picmip.integer;image->depth > gl_max_size.integer;image->depth >>= 1); + for (image->width >>= picmip;image->width > gl_max_size.integer;image->width >>= 1); + for (image->height >>= picmip;image->height > gl_max_size.integer;image->height >>= 1); + for (image->depth >>= picmip;image->depth > gl_max_size.integer;image->depth >>= 1); if (image->width < 1) image->width = 1; if (image->height < 1) image->height = 1; if (image->depth < 1) image->depth = 1; @@ -984,7 +990,7 @@ static void R_FindImageForTexture(gltexture_t *glt) image->texturetype = glt->texturetype; image->glinternalformat = texinfo->glinternalformat; image->glformat = texinfo->glformat; - image->flags = (glt->flags & (TEXF_MIPMAP | TEXF_ALPHA | TEXF_CLAMP)) | GLTEXF_UPLOAD; + image->flags = (glt->flags & (TEXF_MIPMAP | TEXF_ALPHA | TEXF_CLAMP | TEXF_PICMIP)) | GLTEXF_UPLOAD; image->bytesperpixel = texinfo->internalbytesperpixel; image->sides = image->texturetype == GLTEXTURETYPE_CUBEMAP ? 6 : 1; // get a texture number to use diff --git a/model_alias.c b/model_alias.c index 6b64554e..a1bf5ecd 100644 --- a/model_alias.c +++ b/model_alias.c @@ -281,12 +281,12 @@ void Mod_BuildAliasSkinsFromSkinFiles(aliasskin_t *skin, skinfile_t *skinfile, c if (!strcmp(skinfileitem->name, meshname) && strcmp(skinfileitem->replacement, "common/nodraw") && strcmp(skinfileitem->replacement, "textures/common/nodraw")) { memset(&tempskinframe, 0, sizeof(tempskinframe)); - if (Mod_LoadSkinFrame(&tempskinframe, skinfileitem->replacement, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_CLAMP | TEXF_PRECACHE, true, false, true)) + if (Mod_LoadSkinFrame(&tempskinframe, skinfileitem->replacement, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_CLAMP | TEXF_PRECACHE | TEXF_PICMIP, true, false, true)) Mod_BuildAliasSkinFromSkinFrame(skin, &tempskinframe); else { Con_Printf("mesh \"%s\": failed to load skin #%i \"%s\", falling back to mesh's internal shader name \"%s\"\n", meshname, i, skinfileitem->replacement, shadername); - if (Mod_LoadSkinFrame(&tempskinframe, shadername, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_CLAMP | TEXF_PRECACHE, true, false, true)) + if (Mod_LoadSkinFrame(&tempskinframe, shadername, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_CLAMP | TEXF_PRECACHE | TEXF_PICMIP, true, false, true)) Mod_BuildAliasSkinFromSkinFrame(skin, &tempskinframe); else { @@ -301,7 +301,7 @@ void Mod_BuildAliasSkinsFromSkinFiles(aliasskin_t *skin, skinfile_t *skinfile, c else { memset(&tempskinframe, 0, sizeof(tempskinframe)); - if (Mod_LoadSkinFrame(&tempskinframe, shadername, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_CLAMP | TEXF_PRECACHE, true, false, true)) + if (Mod_LoadSkinFrame(&tempskinframe, shadername, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_CLAMP | TEXF_PRECACHE | TEXF_PICMIP, true, false, true)) Mod_BuildAliasSkinFromSkinFrame(skin, &tempskinframe); else { @@ -573,8 +573,8 @@ void Mod_IDP0_Load(model_t *mod, void *buffer) sprintf (name, "%s_%i_%i", loadmodel->name, i, j); else sprintf (name, "%s_%i", loadmodel->name, i); - if (!Mod_LoadSkinFrame(&tempskinframe, name, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_CLAMP | TEXF_ALPHA, true, false, true)) - Mod_LoadSkinFrame_Internal(&tempskinframe, name, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_CLAMP | TEXF_ALPHA, true, false, r_fullbrights.integer, (qbyte *)datapointer, skinwidth, skinheight); + if (!Mod_LoadSkinFrame(&tempskinframe, name, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_CLAMP | TEXF_ALPHA | TEXF_PICMIP, true, false, true)) + Mod_LoadSkinFrame_Internal(&tempskinframe, name, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_CLAMP | TEXF_ALPHA | TEXF_PICMIP, true, false, r_fullbrights.integer, (qbyte *)datapointer, skinwidth, skinheight); Mod_BuildAliasSkinFromSkinFrame(loadmodel->alias.aliasdata_meshes->data_skins + totalskins, &tempskinframe); datapointer += skinwidth * skinheight; totalskins++; @@ -582,7 +582,7 @@ void Mod_IDP0_Load(model_t *mod, void *buffer) } // check for skins that don't exist in the model, but do exist as external images // (this was added because yummyluv kept pestering me about support for it) - while (Mod_LoadSkinFrame(&tempskinframe, va("%s_%i", loadmodel->name, loadmodel->numskins), (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_CLAMP | TEXF_ALPHA, true, false, true)) + while (Mod_LoadSkinFrame(&tempskinframe, va("%s_%i", loadmodel->name, loadmodel->numskins), (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_CLAMP | TEXF_ALPHA | TEXF_PICMIP, true, false, true)) { // expand the arrays to make room tempskinscenes = loadmodel->skinscenes; @@ -711,7 +711,7 @@ void Mod_IDP2_Load(model_t *mod, void *buffer) loadmodel->alias.aliasdata_meshes->data_skins = Mem_Alloc(loadmodel->mempool, loadmodel->alias.aliasdata_meshes->num_skins * sizeof(aliasskin_t)); for (i = 0;i < loadmodel->numskins;i++, inskin += MD2_SKINNAME) { - if (Mod_LoadSkinFrame(&tempskinframe, inskin, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_CLAMP | TEXF_PRECACHE, true, false, true)) + if (Mod_LoadSkinFrame(&tempskinframe, inskin, (r_mipskins.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_CLAMP | TEXF_PRECACHE | TEXF_PICMIP, true, false, true)) Mod_BuildAliasSkinFromSkinFrame(loadmodel->alias.aliasdata_meshes->data_skins + i, &tempskinframe); else { @@ -1207,7 +1207,7 @@ void Mod_ZYMOTICMODEL_Load(model_t *mod, void *buffer) loadmodel->alias.zymdata_textures = Mem_Alloc(loadmodel->mempool, pheader->numshaders * sizeof(rtexture_t *)); shadername = (void *) (pheader->lump_shaders.start + pbase); for (i = 0;i < pheader->numshaders;i++) - loadmodel->alias.zymdata_textures[i] = loadtextureimage(loadmodel->texturepool, shadername + i * 32, 0, 0, true, TEXF_ALPHA | TEXF_PRECACHE | (r_mipskins.integer ? TEXF_MIPMAP : 0)); + loadmodel->alias.zymdata_textures[i] = loadtextureimage(loadmodel->texturepool, shadername + i * 32, 0, 0, true, TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP | (r_mipskins.integer ? TEXF_MIPMAP : 0)); } { diff --git a/model_brush.c b/model_brush.c index 83cafe43..45b5340f 100644 --- a/model_brush.c +++ b/model_brush.c @@ -1023,7 +1023,7 @@ static void Mod_Q1BSP_LoadTextures(lump_t *l) } else { - if (!Mod_LoadSkinFrame(&tx->skin, tx->name, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE, false, true, true)) + if (!Mod_LoadSkinFrame(&tx->skin, tx->name, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, false, true, true)) { // did not find external texture, load it from the bsp or wad3 if (loadmodel->brush.ishlbsp) @@ -1039,7 +1039,7 @@ static void Mod_Q1BSP_LoadTextures(lump_t *l) { tx->width = image_width; tx->height = image_height; - tx->skin.base = tx->skin.merged = R_LoadTexture2D(loadmodel->texturepool, tx->name, image_width, image_height, pixels, TEXTYPE_RGBA, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE, NULL); + tx->skin.base = tx->skin.merged = R_LoadTexture2D(loadmodel->texturepool, tx->name, image_width, image_height, pixels, TEXTYPE_RGBA, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, NULL); if (Image_CheckAlpha(pixels, image_width * image_height, true)) { fogpixels = Mem_Alloc(tempmempool, image_width * image_height * 4); @@ -1050,7 +1050,7 @@ static void Mod_Q1BSP_LoadTextures(lump_t *l) fogpixels[j + 2] = 255; fogpixels[j + 3] = pixels[j + 3]; } - tx->skin.fog = R_LoadTexture2D(loadmodel->texturepool, tx->name, image_width, image_height, pixels, TEXTYPE_RGBA, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE, NULL); + tx->skin.fog = R_LoadTexture2D(loadmodel->texturepool, tx->name, image_width, image_height, pixels, TEXTYPE_RGBA, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, NULL); Mem_Free(fogpixels); } } @@ -1058,7 +1058,7 @@ static void Mod_Q1BSP_LoadTextures(lump_t *l) Mem_Free(freepixels); } else if (mtdata) // texture included - Mod_LoadSkinFrame_Internal(&tx->skin, tx->name, TEXF_MIPMAP | TEXF_PRECACHE, false, true, tx->name[0] != '*' && r_fullbrights.integer, mtdata, tx->width, tx->height); + Mod_LoadSkinFrame_Internal(&tx->skin, tx->name, TEXF_MIPMAP | TEXF_PRECACHE | TEXF_PICMIP, false, true, tx->name[0] != '*' && r_fullbrights.integer, mtdata, tx->width, tx->height); } } if (tx->skin.base == NULL) @@ -3597,7 +3597,7 @@ static void Mod_Q3BSP_LoadTextures(lump_t *l) out->surfaceflags = LittleLong(in->surfaceflags); out->nativecontents = LittleLong(in->contents); out->supercontents = Mod_Q3BSP_SuperContentsFromNativeContents(loadmodel, out->nativecontents); - Mod_LoadSkinFrame(&out->skin, out->name, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE, false, true, true); + Mod_LoadSkinFrame(&out->skin, out->name, TEXF_MIPMAP | TEXF_ALPHA | TEXF_PRECACHE | TEXF_PICMIP, false, true, true); out->surfaceparms = -1; } diff --git a/model_sprite.c b/model_sprite.c index 3b1ce40e..54150f8b 100644 --- a/model_sprite.c +++ b/model_sprite.c @@ -166,7 +166,7 @@ static void Mod_Sprite_SharedSetup(qbyte *datapointer, int version, int *palette sprintf (name, "%s_%i_%i", loadmodel->name, i, j); else sprintf (name, "%s_%i", loadmodel->name, i); - loadmodel->sprite.sprdata_frames[realframes].texture = loadtextureimagewithmask(loadmodel->texturepool, name, 0, 0, false, (r_mipsprites.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_CLAMP | TEXF_PRECACHE); + loadmodel->sprite.sprdata_frames[realframes].texture = loadtextureimagewithmask(loadmodel->texturepool, name, 0, 0, false, (r_mipsprites.integer ? TEXF_MIPMAP : 0) | TEXF_ALPHA | TEXF_CLAMP | TEXF_PRECACHE | TEXF_PICMIP); loadmodel->sprite.sprdata_frames[realframes].fogtexture = image_masktex; if (!loadmodel->sprite.sprdata_frames[realframes].texture) @@ -177,17 +177,17 @@ static void Mod_Sprite_SharedSetup(qbyte *datapointer, int version, int *palette sprintf (fogname, "%s_%ifog", loadmodel->name, i); if (version == SPRITE32_VERSION) { - loadmodel->sprite.sprdata_frames[realframes].texture = R_LoadTexture2D(loadmodel->texturepool, name, width, height, datapointer, TEXTYPE_RGBA, TEXF_ALPHA | (r_mipsprites.integer ? TEXF_MIPMAP : 0) | TEXF_CLAMP | TEXF_PRECACHE, NULL); + loadmodel->sprite.sprdata_frames[realframes].texture = R_LoadTexture2D(loadmodel->texturepool, name, width, height, datapointer, TEXTYPE_RGBA, TEXF_ALPHA | (r_mipsprites.integer ? TEXF_MIPMAP : 0) | TEXF_CLAMP | TEXF_PRECACHE | TEXF_PICMIP, NULL); // make fog version (just alpha) pixbuf = Mem_Alloc(tempmempool, width*height*4); Image_CopyMux(pixbuf, datapointer, width, height, false, false, false, 4, 4, alphaonlytable); - loadmodel->sprite.sprdata_frames[realframes].fogtexture = R_LoadTexture2D(loadmodel->texturepool, fogname, width, height, pixbuf, TEXTYPE_RGBA, TEXF_ALPHA | (r_mipsprites.integer ? TEXF_MIPMAP : 0) | TEXF_CLAMP | TEXF_PRECACHE, NULL); + loadmodel->sprite.sprdata_frames[realframes].fogtexture = R_LoadTexture2D(loadmodel->texturepool, fogname, width, height, pixbuf, TEXTYPE_RGBA, TEXF_ALPHA | (r_mipsprites.integer ? TEXF_MIPMAP : 0) | TEXF_CLAMP | TEXF_PRECACHE | TEXF_PICMIP, NULL); Mem_Free(pixbuf); } else //if (version == SPRITE_VERSION || version == SPRITEHL_VERSION) { - loadmodel->sprite.sprdata_frames[realframes].texture = R_LoadTexture2D(loadmodel->texturepool, name, width, height, datapointer, TEXTYPE_PALETTE, TEXF_ALPHA | (r_mipsprites.integer ? TEXF_MIPMAP : 0) | TEXF_CLAMP | TEXF_PRECACHE, palette); - loadmodel->sprite.sprdata_frames[realframes].fogtexture = R_LoadTexture2D(loadmodel->texturepool, fogname, width, height, datapointer, TEXTYPE_PALETTE, TEXF_ALPHA | (r_mipsprites.integer ? TEXF_MIPMAP : 0) | TEXF_CLAMP | TEXF_PRECACHE, alphapalette); + loadmodel->sprite.sprdata_frames[realframes].texture = R_LoadTexture2D(loadmodel->texturepool, name, width, height, datapointer, TEXTYPE_PALETTE, TEXF_ALPHA | (r_mipsprites.integer ? TEXF_MIPMAP : 0) | TEXF_CLAMP | TEXF_PRECACHE | TEXF_PICMIP, palette); + loadmodel->sprite.sprdata_frames[realframes].fogtexture = R_LoadTexture2D(loadmodel->texturepool, fogname, width, height, datapointer, TEXTYPE_PALETTE, TEXF_ALPHA | (r_mipsprites.integer ? TEXF_MIPMAP : 0) | TEXF_CLAMP | TEXF_PRECACHE | TEXF_PICMIP, alphapalette); } } } -- 2.39.2