diff options
Diffstat (limited to 'utils/xbox/vxconsole/show_textures.cpp')
| -rw-r--r-- | utils/xbox/vxconsole/show_textures.cpp | 971 |
1 files changed, 971 insertions, 0 deletions
diff --git a/utils/xbox/vxconsole/show_textures.cpp b/utils/xbox/vxconsole/show_textures.cpp new file mode 100644 index 0000000..e8e9cbb --- /dev/null +++ b/utils/xbox/vxconsole/show_textures.cpp @@ -0,0 +1,971 @@ +//========= 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; +} |