|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// SHOW_TEXTURES.CPP
//
// Show Textures Display.
//=====================================================================================//
#include "vxconsole.h"
#define ID_SHOWTEXTURES_LISTVIEW 100
// column id
#define ID_ST_NAME 0
#define ID_ST_SIZE 1
#define ID_ST_GROUP 2
#define ID_ST_FORMAT 3
#define ID_ST_WIDTH 4
#define ID_ST_HEIGHT 5
#define ID_ST_DEPTH 6
#define ID_ST_NUMLEVELS 7
#define ID_ST_BINDS 8
#define ID_ST_REFCOUNT 9
#define ID_ST_LOAD 10
typedef enum { LS_STATIC, // surface
LS_PROCEDURAL, // lacks disk based bits
LS_SYNCHRONOUS, // loaded synchronously
LS_FALLBACK, // fallback version, queued hires
LS_HIRES, // finalized at hires
LS_FAILED, // failed to load
LS_MAX } loadState_e;
typedef struct { int listIndex; char *pLongName; char *pShortName; char *pGroupName; char *pFormatName; int size; char sizeBuff[16]; int width; char widthBuff[16]; int height; char heightBuff[16]; int depth; char depthBuff[16]; int numLevels; char numLevelsBuff[16]; int binds; char bindsBuff[16]; int refCount; char refCountBuff[16]; int loadState; int edram; } texture_t;
typedef struct { const CHAR* name; int width; int subItemIndex; CHAR nameBuff[32]; } label_t;
HWND g_showTextures_hWnd; HWND g_showTextures_hWndListView; RECT g_showTextures_windowRect; int g_showTextures_sortColumn; int g_showTextures_sortDescending; texture_t *g_showTextures_pTextures; int g_showTextures_numTextures; int g_showTextures_currentFrame; int g_showTextures_fullPath; char g_showTextures_drawTextureName[MAX_PATH];
char *g_showTextures_loadStrings[LS_MAX] = { "Static", "Procedural", "Synchronous", "Fallback", "", "Failed", };
label_t g_showTextures_Labels[] = { {"Name", 150, ID_ST_NAME}, {"D3D Size", 80, ID_ST_SIZE}, {"Group", 150, ID_ST_GROUP}, {"Format", 120, ID_ST_FORMAT}, {"Width", 80, ID_ST_WIDTH}, {"Height", 80, ID_ST_HEIGHT}, {"Depth", 80, ID_ST_DEPTH}, {"NumLevels", 80, ID_ST_NUMLEVELS}, {"Binds", 80, ID_ST_BINDS}, {"RefCount", 80, ID_ST_REFCOUNT}, {"Load State", 120, ID_ST_LOAD}, };
//-----------------------------------------------------------------------------
// ShowTextures_SaveConfig
//
//-----------------------------------------------------------------------------
void ShowTextures_SaveConfig() { char buff[256];
Sys_SetRegistryInteger( "showTexturesFullPath", g_showTextures_fullPath ); Sys_SetRegistryInteger( "showTexturesCurrentFrame", g_showTextures_currentFrame ); Sys_SetRegistryInteger( "showTexturesSortColumn", g_showTextures_sortColumn ); Sys_SetRegistryInteger( "showTexturesSortDescending", g_showTextures_sortDescending );
WINDOWPLACEMENT wp; memset( &wp, 0, sizeof( wp ) ); wp.length = sizeof( WINDOWPLACEMENT ); GetWindowPlacement( g_showTextures_hWnd, &wp ); g_showTextures_windowRect = wp.rcNormalPosition;
sprintf( buff, "%d %d %d %d", g_showTextures_windowRect.left, g_showTextures_windowRect.top, g_showTextures_windowRect.right, g_showTextures_windowRect.bottom ); Sys_SetRegistryString( "showTexturesWindowRect", buff ); }
//-----------------------------------------------------------------------------
// ShowTextures_LoadConfig
//
//-----------------------------------------------------------------------------
void ShowTextures_LoadConfig() { int numArgs; char buff[256];
Sys_GetRegistryInteger( "showTexturesFullPath", true, g_showTextures_fullPath ); Sys_GetRegistryInteger( "showTexturesCurrentFrame", false, g_showTextures_currentFrame ); Sys_GetRegistryInteger( "showTexturesSortColumn", ID_ST_NAME, g_showTextures_sortColumn ); Sys_GetRegistryInteger( "showTexturesSortDescending", false, g_showTextures_sortDescending );
Sys_GetRegistryString( "showTexturesWindowRect", buff, "", sizeof( buff ) ); numArgs = sscanf( buff, "%d %d %d %d", &g_showTextures_windowRect.left, &g_showTextures_windowRect.top, &g_showTextures_windowRect.right, &g_showTextures_windowRect.bottom ); if ( numArgs != 4 || g_showTextures_windowRect.left < 0 || g_showTextures_windowRect.top < 0 || g_showTextures_windowRect.right < 0 || g_showTextures_windowRect.bottom < 0 ) { memset( &g_showTextures_windowRect, 0, sizeof( g_showTextures_windowRect ) ); } }
//-----------------------------------------------------------------------------
// ShowTextures_Clear
//
//-----------------------------------------------------------------------------
void ShowTextures_Clear() { // delete all the list view entries
if ( g_showTextures_hWnd ) { ListView_DeleteAllItems( g_showTextures_hWndListView ); }
if ( !g_showTextures_pTextures ) { return; }
for ( int i=0; i<g_showTextures_numTextures; i++ ) { free( g_showTextures_pTextures[i].pLongName ); free( g_showTextures_pTextures[i].pShortName ); free( g_showTextures_pTextures[i].pGroupName ); free( g_showTextures_pTextures[i].pFormatName ); }
g_showTextures_pTextures = NULL; g_showTextures_numTextures = 0; }
//-----------------------------------------------------------------------------
// ShowTextures_Export
//
//-----------------------------------------------------------------------------
void ShowTextures_Export() { OPENFILENAME ofn; char logFilename[MAX_PATH]; int retval; FILE* fp; int i; int count;
memset( &ofn, 0, sizeof( ofn ) ); ofn.lStructSize = sizeof( ofn ); ofn.hwndOwner = g_showTextures_hWnd; ofn.lpstrFile = logFilename; ofn.lpstrFile[0] = '\0'; ofn.nMaxFile = sizeof( logFilename ); ofn.lpstrFilter = "Excel CSV\0*.CSV\0All Files\0*.*\0"; ofn.nFilterIndex = 1; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = "c:\\"; ofn.Flags = OFN_PATHMUSTEXIST;
// display the Open dialog box.
retval = GetOpenFileName( &ofn ); if ( !retval ) { return; }
Sys_AddExtension( ".csv", logFilename, sizeof( logFilename ) );
fp = fopen( logFilename, "wt+" ); if ( !fp ) { return; }
// labels
count = sizeof( g_showTextures_Labels )/sizeof( g_showTextures_Labels[0] ); for ( i=0; i<count; i++ ) { fprintf( fp, "\"%s\"", g_showTextures_Labels[i].name ); if ( i != count-1 ) { fprintf( fp, "," ); } } fprintf( fp, "\n" );
// dump to the log
for ( i=0; i<g_showTextures_numTextures; i++ ) { if ( g_showTextures_fullPath ) { fprintf( fp, "\"%s\"", g_showTextures_pTextures[i].pLongName ); } else { fprintf( fp, "\"%s\"", g_showTextures_pTextures[i].pShortName ); } fprintf( fp, ",\"%s\"", g_showTextures_pTextures[i].sizeBuff ); fprintf( fp, ",\"%s\"", g_showTextures_pTextures[i].pGroupName ); fprintf( fp, ",\"%s\"", g_showTextures_pTextures[i].pFormatName ); fprintf( fp, ",\"%s\"", g_showTextures_pTextures[i].widthBuff ); fprintf( fp, ",\"%s\"", g_showTextures_pTextures[i].heightBuff ); fprintf( fp, ",\"%s\"", g_showTextures_pTextures[i].depthBuff ); fprintf( fp, ",\"%s\"", g_showTextures_pTextures[i].numLevelsBuff ); fprintf( fp, ",\"%s\"", g_showTextures_pTextures[i].bindsBuff ); fprintf( fp, ",\"%s\"", g_showTextures_pTextures[i].refCountBuff ); fprintf( fp, ",\"%s\"", g_showTextures_loadStrings[g_showTextures_pTextures[i].loadState] ); fprintf( fp, "\n" ); }
fclose( fp ); }
//-----------------------------------------------------------------------------
// ShowTextures_Summary
//
//-----------------------------------------------------------------------------
void ShowTextures_Summary() { char buff[1024];
// tally the totals
int total = 0; for ( int i=0; i<g_showTextures_numTextures; i++ ) { if ( g_showTextures_pTextures[i].edram ) { // edram is does not affect system memory total
continue; } total += g_showTextures_pTextures[i].size; }
sprintf( buff, "Entries:\t\t\t%d\n" "System D3D Memory:\t%.2f MB\n", g_showTextures_numTextures, ( float )total/( 1024.0F*1024.0F ) );
MessageBox( g_showTextures_hWnd, buff, "Texture Summary", MB_OK|MB_APPLMODAL ); }
//-----------------------------------------------------------------------------
// ShowTextures_DrawTexture
//
//-----------------------------------------------------------------------------
void ShowTextures_DrawTexture() { char command[256]; texture_t* pTexture; int selection; LVITEM lvitem;
if ( !g_connectedToApp ) return;
selection = ListView_GetSelectionMark( g_showTextures_hWndListView ); if ( selection == -1 ) return;
memset( &lvitem, 0, sizeof( lvitem ) ); lvitem.mask = LVIF_PARAM; lvitem.iItem = selection; ListView_GetItem( g_showTextures_hWndListView, &lvitem );
pTexture = ( texture_t* )lvitem.lParam;
if ( !V_stricmp( g_showTextures_drawTextureName, pTexture->pLongName ) ) { // hide
sprintf( command, "mat_drawTexture \"\"" ); g_showTextures_drawTextureName[0] = '\0'; } else { // show
sprintf( command, "mat_drawTexture %s", pTexture->pLongName ); V_strncpy( g_showTextures_drawTextureName, pTexture->pLongName, sizeof( g_showTextures_drawTextureName ) ); }
// send the command to application
ProcessCommand( command ); }
//-----------------------------------------------------------------------------
// ShowTextures_SetTitle
//
//-----------------------------------------------------------------------------
void ShowTextures_SetTitle() { char titleBuff[128];
if ( g_showTextures_hWnd ) { strcpy( titleBuff, "Textures " ); if ( g_showTextures_currentFrame ) { strcat( titleBuff, " [FRAME]" ); } if ( g_showTextures_fullPath ) { strcat( titleBuff, " [FULL PATH]" ); }
SetWindowText( g_showTextures_hWnd, titleBuff ); } }
//-----------------------------------------------------------------------------
// ShowTextures_CompareFunc
//
//-----------------------------------------------------------------------------
int CALLBACK ShowTextures_CompareFunc( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort ) { texture_t* pTextureA = ( texture_t* )lParam1; texture_t* pTextureB = ( texture_t* )lParam2;
int sort = 0; switch ( g_showTextures_sortColumn ) { case ID_ST_NAME: if ( g_showTextures_fullPath ) { sort = stricmp( pTextureA->pLongName, pTextureB->pLongName ); } else { sort = stricmp( pTextureA->pShortName, pTextureB->pShortName ); } break;
case ID_ST_GROUP: sort = stricmp( pTextureA->pGroupName, pTextureB->pGroupName ); break;
case ID_ST_FORMAT: sort = stricmp( pTextureA->pFormatName, pTextureB->pFormatName ); break;
case ID_ST_SIZE: sort = pTextureA->size - pTextureB->size; break;
case ID_ST_WIDTH: sort = pTextureA->width - pTextureB->width; break;
case ID_ST_HEIGHT: sort = pTextureA->height - pTextureB->height; break;
case ID_ST_DEPTH: sort = pTextureA->depth - pTextureB->depth; break;
case ID_ST_NUMLEVELS: sort = pTextureA->numLevels - pTextureB->numLevels; break;
case ID_ST_BINDS: sort = pTextureA->binds - pTextureB->binds; break;
case ID_ST_REFCOUNT: sort = pTextureA->refCount - pTextureB->refCount; break;
case ID_ST_LOAD: sort = stricmp( g_showTextures_loadStrings[pTextureA->loadState], g_showTextures_loadStrings[pTextureB->loadState] ); break; }
// flip the sort order
if ( g_showTextures_sortDescending ) { sort *= -1; }
return ( sort ); }
//-----------------------------------------------------------------------------
// ShowTextures_SortItems
//
//-----------------------------------------------------------------------------
void ShowTextures_SortItems() { LVITEM lvitem; texture_t *pTexture; int i;
if ( !g_showTextures_hWnd ) { // only sort if window is visible
return; }
ListView_SortItems( g_showTextures_hWndListView, ShowTextures_CompareFunc, 0 );
memset( &lvitem, 0, sizeof( lvitem ) ); lvitem.mask = LVIF_PARAM;
// get each item and reset its list index
int itemCount = ListView_GetItemCount( g_showTextures_hWndListView ); for ( i=0; i<itemCount; i++ ) { lvitem.iItem = i; ListView_GetItem( g_showTextures_hWndListView, &lvitem );
pTexture = ( texture_t* )lvitem.lParam; pTexture->listIndex = i; }
// update list view columns with sort key
for ( i=0; i<sizeof( g_showTextures_Labels )/sizeof( g_showTextures_Labels[0] ); i++ ) { char symbol; LVCOLUMN lvc;
if ( i == g_showTextures_sortColumn ) { symbol = g_showTextures_sortDescending ? '<' : '>'; } else { symbol = ' '; } sprintf( g_showTextures_Labels[i].nameBuff, "%s %c", g_showTextures_Labels[i].name, symbol );
memset( &lvc, 0, sizeof( lvc ) ); lvc.mask = LVCF_TEXT; lvc.pszText = ( LPSTR )g_showTextures_Labels[i].nameBuff;
ListView_SetColumn( g_showTextures_hWndListView, i, &lvc ); } }
//-----------------------------------------------------------------------------
// ShowTextures_AddViewItem
//
//-----------------------------------------------------------------------------
void ShowTextures_AddViewItem( texture_t* pTexture ) { LVITEM lvi;
if ( !g_showTextures_hWnd ) { // only valid if log window is visible
return; }
// update the text callback buffers
sprintf( pTexture->sizeBuff, "%d", pTexture->size ); sprintf( pTexture->widthBuff, "%d", pTexture->width ); sprintf( pTexture->heightBuff, "%d", pTexture->height ); sprintf( pTexture->depthBuff, "%d", pTexture->depth ); sprintf( pTexture->numLevelsBuff, "%d", pTexture->numLevels ); sprintf( pTexture->bindsBuff, "%d", pTexture->binds ); sprintf( pTexture->refCountBuff, "%d", pTexture->refCount );
int itemCount = ListView_GetItemCount( g_showTextures_hWndListView );
// setup and insert at end of list
memset( &lvi, 0, sizeof( lvi ) ); lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE; lvi.iItem = itemCount; lvi.iSubItem = 0; lvi.state = 0; lvi.stateMask = 0; lvi.pszText = LPSTR_TEXTCALLBACK; lvi.lParam = ( LPARAM )pTexture; // insert and set the real index
pTexture->listIndex = ListView_InsertItem( g_showTextures_hWndListView, &lvi ); }
//-----------------------------------------------------------------------------
// ShowTextures_Refresh
//
//-----------------------------------------------------------------------------
void ShowTextures_Refresh() { char command[256];
strcpy( command, "mat_get_textures" );
if ( !g_showTextures_currentFrame ) { strcat( command, " all" ); }
// send the command to application which replies with list data
if ( g_connectedToApp ) { ProcessCommand( command ); } }
//-----------------------------------------------------------------------------
// ShowTextures_SizeWindow
//
//-----------------------------------------------------------------------------
void ShowTextures_SizeWindow( HWND hwnd, int cx, int cy ) { if ( cx==0 || cy==0 ) { RECT rcClient; GetClientRect( hwnd, &rcClient ); cx = rcClient.right; cy = rcClient.bottom; }
// position the ListView
SetWindowPos( g_showTextures_hWndListView, NULL, 0, 0, cx, cy, SWP_NOZORDER ); }
//-----------------------------------------------------------------------------
// ShowTextures_WndProc
//
//-----------------------------------------------------------------------------
LRESULT CALLBACK ShowTextures_WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { WORD wID = LOWORD( wParam ); texture_t* pTexture;
switch ( message ) { case WM_CREATE: return 0L;
case WM_DESTROY: ShowTextures_SaveConfig(); g_showTextures_hWnd = NULL; return 0L; case WM_INITMENU: CheckMenuItem( ( HMENU )wParam, IDM_OPTIONS_CURRENTFRAME, MF_BYCOMMAND | ( g_showTextures_currentFrame ? MF_CHECKED : MF_UNCHECKED ) ); CheckMenuItem( ( HMENU )wParam, IDM_OPTIONS_FULLPATH, MF_BYCOMMAND | ( g_showTextures_fullPath ? MF_CHECKED : MF_UNCHECKED ) ); return 0L;
case WM_SIZE: ShowTextures_SizeWindow( hwnd, LOWORD( lParam ), HIWORD( lParam ) ); return 0L;
case WM_NOTIFY: switch ( ( ( LPNMHDR )lParam )->code ) { case LVN_COLUMNCLICK: NMLISTVIEW* pnmlv; pnmlv = ( NMLISTVIEW* )lParam; if ( g_showTextures_sortColumn == pnmlv->iSubItem ) { // user has clicked on same column - flip the sort
g_showTextures_sortDescending ^= 1; } else { // sort by new column
g_showTextures_sortColumn = pnmlv->iSubItem; } ShowTextures_SortItems(); return 0L;
case LVN_GETDISPINFO: NMLVDISPINFO* plvdi; plvdi = ( NMLVDISPINFO* )lParam; pTexture = ( texture_t* )plvdi->item.lParam; switch ( plvdi->item.iSubItem ) { case ID_ST_NAME: if ( g_showTextures_fullPath ) plvdi->item.pszText = pTexture->pLongName; else plvdi->item.pszText = pTexture->pShortName; return 0L; case ID_ST_GROUP: plvdi->item.pszText = pTexture->pGroupName; return 0L;
case ID_ST_FORMAT: plvdi->item.pszText = pTexture->pFormatName; return 0L;
case ID_ST_SIZE: plvdi->item.pszText = pTexture->sizeBuff; return 0L;
case ID_ST_WIDTH: plvdi->item.pszText = pTexture->widthBuff; return 0L;
case ID_ST_HEIGHT: plvdi->item.pszText = pTexture->heightBuff; return 0L;
case ID_ST_DEPTH: plvdi->item.pszText = pTexture->depthBuff; return 0L;
case ID_ST_NUMLEVELS: plvdi->item.pszText = pTexture->numLevelsBuff; return 0L;
case ID_ST_BINDS: plvdi->item.pszText = pTexture->bindsBuff; return 0L;
case ID_ST_LOAD: plvdi->item.pszText = g_showTextures_loadStrings[pTexture->loadState]; return 0L;
case ID_ST_REFCOUNT: plvdi->item.pszText = pTexture->refCountBuff; return 0L;
default: break; } break; } break;
case WM_COMMAND: switch ( wID ) { case IDM_OPTIONS_SUMMARY: ShowTextures_Summary(); return 0L;
case IDM_OPTIONS_REFRESH: ShowTextures_Refresh(); return 0L;
case IDM_OPTIONS_EXPORT: ShowTextures_Export(); return 0L;
case IDM_OPTIONS_CURRENTFRAME: g_showTextures_currentFrame ^= 1; ShowTextures_SetTitle(); ShowTextures_Refresh(); return 0L;
case IDM_OPTIONS_FULLPATH: g_showTextures_fullPath ^= 1; ShowTextures_SetTitle(); ShowTextures_SortItems(); return 0L;
case IDM_OPTIONS_DRAWTEXTURE: ShowTextures_DrawTexture(); return 0L; } break; }
return ( DefWindowProc( hwnd, message, wParam, lParam ) ); }
//-----------------------------------------------------------------------------
// ShowTextures_Init
//
//-----------------------------------------------------------------------------
bool ShowTextures_Init() { // set up our window class
WNDCLASS wndclass;
memset( &wndclass, 0, sizeof( wndclass ) ); wndclass.style = 0; wndclass.lpfnWndProc = ShowTextures_WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = g_hInstance; wndclass.hIcon = g_hIcons[ICON_APPLICATION]; wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ); wndclass.hbrBackground = g_hBackgroundBrush; wndclass.lpszMenuName = MAKEINTRESOURCE( MENU_SHOWTEXTURES ); wndclass.lpszClassName = "SHOWTEXTURESCLASS"; if ( !RegisterClass( &wndclass ) ) return false;
ShowTextures_LoadConfig();
return true; }
//-----------------------------------------------------------------------------
// ShowTextures_Open
//
//-----------------------------------------------------------------------------
void ShowTextures_Open() { RECT clientRect; HWND hWnd; int i;
if ( g_showTextures_hWnd ) { // only one instance
if ( IsIconic( g_showTextures_hWnd ) ) { ShowWindow( g_showTextures_hWnd, SW_RESTORE ); } SetForegroundWindow( g_showTextures_hWnd ); return; }
hWnd = CreateWindowEx( WS_EX_CLIENTEDGE, "SHOWTEXTURESCLASS", "", WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX|WS_MINIMIZEBOX|WS_MAXIMIZEBOX, 0, 0, 700, 400, g_hDlgMain, NULL, g_hInstance, NULL ); g_showTextures_hWnd = hWnd;
GetClientRect( g_showTextures_hWnd, &clientRect ); hWnd = CreateWindow( WC_LISTVIEW, "", WS_VISIBLE|WS_CHILD|LVS_REPORT, 0, 0, clientRect.right-clientRect.left, clientRect.bottom-clientRect.top, g_showTextures_hWnd, ( HMENU )ID_SHOWTEXTURES_LISTVIEW, g_hInstance, NULL ); g_showTextures_hWndListView = hWnd;
// init list view columns
for ( i=0; i<sizeof( g_showTextures_Labels )/sizeof( g_showTextures_Labels[0] ); i++ ) { LVCOLUMN lvc; memset( &lvc, 0, sizeof( lvc ) );
lvc.mask = LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM; lvc.iSubItem = 0; lvc.cx = g_showTextures_Labels[i].width; lvc.fmt = LVCFMT_LEFT; lvc.pszText = ( LPSTR )g_showTextures_Labels[i].name; ListView_InsertColumn( g_showTextures_hWndListView, i, &lvc ); }
ListView_SetBkColor( g_showTextures_hWndListView, g_backgroundColor ); ListView_SetTextBkColor( g_showTextures_hWndListView, g_backgroundColor );
DWORD style = LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP; ListView_SetExtendedListViewStyleEx( g_showTextures_hWndListView, style, style );
// populate list view
for ( i=0; i<g_showTextures_numTextures; i++ ) { ShowTextures_AddViewItem( &g_showTextures_pTextures[i] ); } ShowTextures_SortItems();
ShowTextures_SetTitle();
if ( g_showTextures_windowRect.right && g_showTextures_windowRect.bottom ) { MoveWindow( g_showTextures_hWnd, g_showTextures_windowRect.left, g_showTextures_windowRect.top, g_showTextures_windowRect.right-g_showTextures_windowRect.left, g_showTextures_windowRect.bottom-g_showTextures_windowRect.top, FALSE ); } ShowWindow( g_showTextures_hWnd, SHOW_OPENWINDOW );
// get data from application
ShowTextures_Refresh(); }
//-----------------------------------------------------------------------------
// rc_TextureList
//
// Sent from application with texture list
//-----------------------------------------------------------------------------
int rc_TextureList( char* commandPtr ) { int errCode = -1; char* cmdToken; int numTextures; int textureList; int retAddr; int retVal; xrTexture_t* pLocalList;
// remove old entries
ShowTextures_Clear();
// get number of textures
cmdToken = GetToken( &commandPtr ); if ( !cmdToken[0] ) goto cleanUp; sscanf( cmdToken, "%x", &numTextures );
// get texture list
cmdToken = GetToken( &commandPtr ); if ( !cmdToken[0] ) goto cleanUp; sscanf( cmdToken, "%x", &textureList );
// get retAddr
cmdToken = GetToken( &commandPtr ); if ( !cmdToken[0] ) goto cleanUp; sscanf( cmdToken, "%x", &retAddr );
pLocalList = new xrTexture_t[numTextures]; memset( pLocalList, 0, numTextures*sizeof( xrTexture_t ) );
g_showTextures_numTextures = numTextures; g_showTextures_pTextures = new texture_t[numTextures]; memset( g_showTextures_pTextures, 0, numTextures*sizeof( texture_t ) );
// get the caller's command list
DmGetMemory( ( void* )textureList, numTextures*sizeof( xrTexture_t ), pLocalList, NULL );
// build out the resident list
for ( int i=0; i<numTextures; i++ ) { // swap the structure
pLocalList[i].size = BigDWord( pLocalList[i].size ); pLocalList[i].width = BigDWord( pLocalList[i].width ); pLocalList[i].height = BigDWord( pLocalList[i].height ); pLocalList[i].depth = BigDWord( pLocalList[i].depth ); pLocalList[i].numLevels = BigDWord( pLocalList[i].numLevels ); pLocalList[i].binds = BigDWord( pLocalList[i].binds ); pLocalList[i].refCount = BigDWord( pLocalList[i].refCount ); pLocalList[i].sRGB = BigDWord( pLocalList[i].sRGB ); pLocalList[i].edram = BigDWord( pLocalList[i].edram ); pLocalList[i].procedural = BigDWord( pLocalList[i].procedural ); pLocalList[i].fallback = BigDWord( pLocalList[i].fallback ); pLocalList[i].final = BigDWord( pLocalList[i].final ); pLocalList[i].failed = BigDWord( pLocalList[i].failed );
// get the name
g_showTextures_pTextures[i].pLongName = strdup( pLocalList[i].nameString );
CHAR shortName[MAX_PATH]; Sys_StripPath( g_showTextures_pTextures[i].pLongName, shortName, sizeof( shortName ) ); g_showTextures_pTextures[i].pShortName = strdup( shortName );
// get the group name
g_showTextures_pTextures[i].pGroupName = strdup( pLocalList[i].groupString );
// get the format name
const char *pFormatName = pLocalList[i].formatString; if ( !strnicmp( pFormatName, "D3DFMT_", 7 ) ) { // strip D3DFMT_
pFormatName += 7; } char tempName[MAX_PATH]; if ( pLocalList[i].sRGB ) { strcpy( tempName, pFormatName ); strcat( tempName, " (SRGB)" ); pFormatName = tempName; } g_showTextures_pTextures[i].pFormatName = strdup( pFormatName );
g_showTextures_pTextures[i].size = pLocalList[i].size; g_showTextures_pTextures[i].width = pLocalList[i].width; g_showTextures_pTextures[i].height = pLocalList[i].height; g_showTextures_pTextures[i].depth = pLocalList[i].depth; g_showTextures_pTextures[i].numLevels = pLocalList[i].numLevels; g_showTextures_pTextures[i].binds = pLocalList[i].binds; g_showTextures_pTextures[i].refCount = pLocalList[i].refCount; g_showTextures_pTextures[i].edram = pLocalList[i].edram;
loadState_e loadState; if ( pLocalList[i].edram || V_stristr( g_showTextures_pTextures[i].pGroupName, "RenderTarget" ) ) { loadState = LS_STATIC; } else if ( pLocalList[i].procedural ) { loadState = LS_PROCEDURAL; } else if ( pLocalList[i].final ) { loadState = LS_HIRES; } else if ( pLocalList[i].failed ) { loadState = LS_FAILED; } else if ( pLocalList[i].fallback ) { loadState = LS_FALLBACK; } else { loadState = LS_SYNCHRONOUS; } g_showTextures_pTextures[i].loadState = loadState;
// add to list view
ShowTextures_AddViewItem( &g_showTextures_pTextures[i] ); }
// return the result
retVal = numTextures; int xboxRetVal = BigDWord( retVal ); DmSetMemory( ( void* )retAddr, sizeof( int ), &xboxRetVal, NULL );
DebugCommand( "0x%8.8x = TextureList( 0x%8.8x, 0x%8.8x )\n", retVal, numTextures, textureList );
delete [] pLocalList;
// update
ShowTextures_SortItems();
// success
errCode = 0;
cleanUp: return errCode; }
|