/* =============== RB_ShowImages Draw all the images to the screen, on top of whatever was there. This is used to test for texture thrashing. Also called by RE_EndRegistration =============== */ void RB_ShowImages( void ) { image_t *image; float x, y, w, h; int start, end; if ( !backEnd.projection2D ) { RB_SetGL2D(); } qglFinish(); start = Sys_Milliseconds(); int i=0; // int iNumImages = R_Images_StartIteration(); while ( (image = R_Images_GetNextIteration()) != NULL) { w = glConfig.vidWidth / 20; h = glConfig.vidHeight / 15; x = i % 20 * w; y = i / 20 * h; // show in proportional size in mode 2 if ( r_showImages->integer == 2 ) { w *= image->width / 512.0; h *= image->height / 512.0; } GL_Bind( image ); #ifdef _XBOX qglBeginEXT (GL_QUADS, 4, 0, 0, 4, 0); #else qglBegin (GL_QUADS); #endif qglTexCoord2f( 0, 0 ); qglVertex2f( x, y ); qglTexCoord2f( 1, 0 ); qglVertex2f( x + w, y ); qglTexCoord2f( 1, 1 ); qglVertex2f( x + w, y + h ); qglTexCoord2f( 0, 1 ); qglVertex2f( x, y + h ); qglEnd(); i++; } qglFinish(); end = Sys_Milliseconds(); //VID_Printf( PRINT_ALL, "%i msec to draw all images\n", end - start ); }
/* =============== RB_ShowImages Draw all the images to the screen, on top of whatever was there. This is used to test for texture thrashing. Also called by RE_EndRegistration =============== */ void RB_ShowImages( void ) { image_t *image; float x, y, w, h; int start, end; if ( !backEnd.projection2D ) { RB_SetGL2D(); } qglClear( GL_COLOR_BUFFER_BIT ); qglFinish(); start = ri.Milliseconds(); int i=0; R_Images_StartIteration(); while ( (image = R_Images_GetNextIteration()) != NULL) { w = glConfig.vidWidth / 20; h = glConfig.vidHeight / 15; x = i % 20 * w; y = i / 20 * h; // show in proportional size in mode 2 if ( r_showImages->integer == 2 ) { w *= image->uploadWidth / 512.0; h *= image->uploadHeight / 512.0; } GL_Bind( image ); qglBegin (GL_QUADS); qglTexCoord2f( 0, 0 ); qglVertex2f( x, y ); qglTexCoord2f( 1, 0 ); qglVertex2f( x + w, y ); qglTexCoord2f( 1, 1 ); qglVertex2f( x + w, y + h ); qglTexCoord2f( 0, 1 ); qglVertex2f( x, y + h ); qglEnd(); i++; } qglFinish(); end = ri.Milliseconds(); ri.Printf( PRINT_ALL, "%i msec to draw all images\n", end - start ); }
/* =============== GL_TextureMode =============== */ void GL_TextureMode( const char *string ) { size_t i; image_t *glt; for ( i = 0; i < numTextureModes ; i++ ) { if ( !Q_stricmp( modes[i].name, string ) ) { break; } } if ( i == numTextureModes ) { ri.Printf (PRINT_ALL, "bad filter name\n"); for ( i = 0; i < numTextureModes ; i++ ) { ri.Printf( PRINT_ALL, "%s\n", modes[i].name); } return; } gl_filter_min = modes[i].minimize; gl_filter_max = modes[i].maximize; // If the level they requested is less than possible, set the max possible... if ( r_ext_texture_filter_anisotropic->value > glConfig.maxTextureFilterAnisotropy ) { ri.Cvar_SetValue( "r_ext_texture_filter_anisotropic", glConfig.maxTextureFilterAnisotropy ); } // change all the existing mipmap texture objects // int iNumImages = R_Images_StartIteration(); while ( (glt = R_Images_GetNextIteration()) != NULL) { if ( glt->mipmap ) { GL_Bind (glt); qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_filter_min); qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max); if(glConfig.maxTextureFilterAnisotropy>0) { if(r_ext_texture_filter_anisotropic->integer>1) { qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, r_ext_texture_filter_anisotropic->value); } else { qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 1.0f); } } } } }
/* =============== R_SumOfUsedImages =============== */ float R_SumOfUsedImages( qboolean bUseFormat ) { int total = 0; image_t *pImage; R_Images_StartIteration(); while ( (pImage = R_Images_GetNextIteration()) != NULL) { if ( pImage->frameUsed == tr.frameCount- 1 ) {//it has already been advanced for the next frame, so... if (bUseFormat) { float bytePerTex = R_BytesPerTex (pImage->internalFormat); total += bytePerTex * (pImage->width * pImage->height); } else { total += pImage->width * pImage->height; } } } return total; }
/* =============== R_ImageList_f =============== */ void R_ImageList_f( void ) { int i=0; image_t *image; int texels = 0; // int totalFileSizeK = 0; float texBytes = 0.0f; const char *yesno[] = {"no ", "yes"}; ri.Printf (PRINT_ALL, "\n -w-- -h-- -fsK- -mm- -if- wrap --name-------\n"); int iNumImages = R_Images_StartIteration(); while ( (image = R_Images_GetNextIteration()) != NULL) { texels += image->width*image->height; texBytes += image->width*image->height * R_BytesPerTex (image->internalFormat); // totalFileSizeK += (image->imgfileSize+1023)/1024; //ri.Printf (PRINT_ALL, "%4i: %4i %4i %5i %s ", // i, image->width, image->height,(image->fileSize+1023)/1024, yesno[image->mipmap] ); ri.Printf (PRINT_ALL, "%4i: %4i %4i %s ", i, image->width, image->height,yesno[image->mipmap] ); switch ( image->internalFormat ) { case 1: ri.Printf( PRINT_ALL, "I " ); break; case 2: ri.Printf( PRINT_ALL, "IA " ); break; case 3: ri.Printf( PRINT_ALL, "RGB " ); break; case 4: ri.Printf( PRINT_ALL, "RGBA " ); break; case GL_RGBA8: ri.Printf( PRINT_ALL, "RGBA8" ); break; case GL_RGB8: ri.Printf( PRINT_ALL, "RGB8 " ); break; case GL_RGB4_S3TC: ri.Printf( PRINT_ALL, "S3TC " ); break; case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: ri.Printf( PRINT_ALL, "DXT1 " ); break; case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: ri.Printf( PRINT_ALL, "DXT5 " ); break; case GL_RGBA4: ri.Printf( PRINT_ALL, "RGBA4" ); break; case GL_RGB5: ri.Printf( PRINT_ALL, "RGB5 " ); break; default: ri.Printf( PRINT_ALL, "???? " ); } switch ( image->wrapClampMode ) { case GL_REPEAT: ri.Printf( PRINT_ALL, "rept " ); break; case GL_CLAMP: ri.Printf( PRINT_ALL, "clmp " ); break; case GL_CLAMP_TO_EDGE: ri.Printf( PRINT_ALL, "clpE " ); break; default: ri.Printf( PRINT_ALL, "%4i ", image->wrapClampMode ); break; } ri.Printf( PRINT_ALL, "%s\n", image->imgName ); i++; } ri.Printf (PRINT_ALL, " ---------\n"); ri.Printf (PRINT_ALL, " -w-- -h-- -mm- -if- wrap --name-------\n"); ri.Printf (PRINT_ALL, " %i total texels (not including mipmaps)\n", texels ); // ri.Printf (PRINT_ALL, " %iMB total filesize\n", (totalFileSizeK+1023)/1024 ); ri.Printf (PRINT_ALL, " %.2fMB total texture mem (not including mipmaps)\n", texBytes/1048576.0f ); ri.Printf (PRINT_ALL, " %i total images\n\n", iNumImages ); }