//========= 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; ipLongName ) ) { // 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; ilistIndex = i; } // update list view columns with sort key for ( i=0; i'; } 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