//========= Copyright Valve Corporation, All rights reserved. ============// // // SHOW_MATERIALS.CPP // // Show Materials Display. //=====================================================================================// #include "vxconsole.h" #define ID_SHOWMATERIALS_LISTVIEW 100 // column id #define ID_SM_NAME 0 #define ID_SM_SHADER 1 #define ID_SM_REFCOUNT 2 typedef struct { int listIndex; char *pName; char *pShaderName; int refCount; char refCountBuff[16]; } material_t; typedef struct { const CHAR* name; int width; int subItemIndex; CHAR nameBuff[32]; } label_t; HWND g_showMaterials_hWnd; HWND g_showMaterials_hWndListView; RECT g_showMaterials_windowRect; int g_showMaterials_sortColumn; int g_showMaterials_sortDescending; material_t *g_showMaterials_pMaterials; int g_showMaterials_numMaterials; int g_showMaterials_currentFrame; label_t g_showMaterials_Labels[] = { {"Name", 300, ID_SM_NAME}, {"Shader", 150, ID_SM_SHADER}, {"RefCount", 80, ID_SM_REFCOUNT}, }; //----------------------------------------------------------------------------- // ShowMaterials_SaveConfig // //----------------------------------------------------------------------------- void ShowMaterials_SaveConfig() { char buff[256]; Sys_SetRegistryInteger( "showMaterialsCurrentFrame", g_showMaterials_currentFrame ); Sys_SetRegistryInteger( "showMaterialsSortColumn", g_showMaterials_sortColumn ); Sys_SetRegistryInteger( "showMaterialsSortDescending", g_showMaterials_sortDescending ); WINDOWPLACEMENT wp; memset( &wp, 0, sizeof( wp ) ); wp.length = sizeof( WINDOWPLACEMENT ); GetWindowPlacement( g_showMaterials_hWnd, &wp ); g_showMaterials_windowRect = wp.rcNormalPosition; sprintf( buff, "%d %d %d %d", g_showMaterials_windowRect.left, g_showMaterials_windowRect.top, g_showMaterials_windowRect.right, g_showMaterials_windowRect.bottom ); Sys_SetRegistryString( "showMaterialsWindowRect", buff ); } //----------------------------------------------------------------------------- // ShowMaterials_LoadConfig // //----------------------------------------------------------------------------- void ShowMaterials_LoadConfig() { int numArgs; char buff[256]; Sys_GetRegistryInteger( "showMaterialsCurrentFrame", false, g_showMaterials_currentFrame ); Sys_GetRegistryInteger( "showMaterialsSortColumn", ID_SM_NAME, g_showMaterials_sortColumn ); Sys_GetRegistryInteger( "showMaterialsSortDescending", false, g_showMaterials_sortDescending ); Sys_GetRegistryString( "showMaterialsWindowRect", buff, "", sizeof( buff ) ); numArgs = sscanf( buff, "%d %d %d %d", &g_showMaterials_windowRect.left, &g_showMaterials_windowRect.top, &g_showMaterials_windowRect.right, &g_showMaterials_windowRect.bottom ); if ( numArgs != 4 || g_showMaterials_windowRect.left < 0 || g_showMaterials_windowRect.top < 0 || g_showMaterials_windowRect.right < 0 || g_showMaterials_windowRect.bottom < 0 ) memset( &g_showMaterials_windowRect, 0, sizeof( g_showMaterials_windowRect ) ); } //----------------------------------------------------------------------------- // ShowMaterials_Clear // //----------------------------------------------------------------------------- void ShowMaterials_Clear() { // delete all the list view entries if ( g_showMaterials_hWnd ) ListView_DeleteAllItems( g_showMaterials_hWndListView ); if ( !g_showMaterials_pMaterials ) return; for ( int i=0; ipName, pMaterialB->pName ); break; case ID_SM_SHADER: sort = stricmp( pMaterialA->pShaderName, pMaterialB->pShaderName ); break; case ID_SM_REFCOUNT: sort = pMaterialA->refCount - pMaterialB->refCount; break; } // flip the sort order if ( g_showMaterials_sortDescending ) sort *= -1; return ( sort ); } //----------------------------------------------------------------------------- // ShowMaterials_SortItems // //----------------------------------------------------------------------------- void ShowMaterials_SortItems() { LVITEM lvitem; material_t *pMaterial; int i; if ( !g_showMaterials_hWnd ) { // only sort if window is visible return; } ListView_SortItems( g_showMaterials_hWndListView, ShowMaterials_CompareFunc, 0 ); memset( &lvitem, 0, sizeof( lvitem ) ); lvitem.mask = LVIF_PARAM; // get each item and reset its list index int itemCount = ListView_GetItemCount( g_showMaterials_hWndListView ); for ( i=0; ilistIndex = i; } // update list view columns with sort key for ( i=0; i'; else symbol = ' '; sprintf( g_showMaterials_Labels[i].nameBuff, "%s %c", g_showMaterials_Labels[i].name, symbol ); memset( &lvc, 0, sizeof( lvc ) ); lvc.mask = LVCF_TEXT; lvc.pszText = ( LPSTR )g_showMaterials_Labels[i].nameBuff; ListView_SetColumn( g_showMaterials_hWndListView, i, &lvc ); } } //----------------------------------------------------------------------------- // ShowMaterials_AddViewItem // //----------------------------------------------------------------------------- void ShowMaterials_AddViewItem( material_t* pMaterial ) { LVITEM lvi; if ( !g_showMaterials_hWnd ) { // only valid if log window is visible return; } // update the text callback buffers sprintf( pMaterial->refCountBuff, "%d", pMaterial->refCount ); int itemCount = ListView_GetItemCount( g_showMaterials_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 )pMaterial; // insert and set the real index pMaterial->listIndex = ListView_InsertItem( g_showMaterials_hWndListView, &lvi ); } //----------------------------------------------------------------------------- // ShowMaterials_Refresh // //----------------------------------------------------------------------------- void ShowMaterials_Refresh() { char command[256]; strcpy( command, "mat_material_list" ); // if ( !g_showMaterials_currentFrame ) // strcat( command, " all" ); // send the command to application which replies with list data if ( g_connectedToApp ) ProcessCommand( command ); } //----------------------------------------------------------------------------- // ShowMaterials_SizeWindow // //----------------------------------------------------------------------------- void ShowMaterials_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_showMaterials_hWndListView, NULL, 0, 0, cx, cy, SWP_NOZORDER ); } //----------------------------------------------------------------------------- // ShowMaterials_WndProc // //----------------------------------------------------------------------------- LRESULT CALLBACK ShowMaterials_WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam ) { WORD wID = LOWORD( wParam ); material_t* pMaterial; switch ( message ) { case WM_CREATE: return 0L; case WM_DESTROY: ShowMaterials_SaveConfig(); g_showMaterials_hWnd = NULL; return 0L; case WM_INITMENU: CheckMenuItem( ( HMENU )wParam, IDM_OPTIONS_CURRENTFRAME, MF_BYCOMMAND | ( g_showMaterials_currentFrame ? MF_CHECKED : MF_UNCHECKED ) ); return 0L; case WM_SIZE: ShowMaterials_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_showMaterials_sortColumn == pnmlv->iSubItem ) { // user has clicked on same column - flip the sort g_showMaterials_sortDescending ^= 1; } else { // sort by new column g_showMaterials_sortColumn = pnmlv->iSubItem; } ShowMaterials_SortItems(); return 0L; case LVN_GETDISPINFO: NMLVDISPINFO* plvdi; plvdi = ( NMLVDISPINFO* )lParam; pMaterial = ( material_t* )plvdi->item.lParam; switch ( plvdi->item.iSubItem ) { case ID_SM_NAME: plvdi->item.pszText = pMaterial->pName; return 0L; case ID_SM_SHADER: plvdi->item.pszText = pMaterial->pShaderName; return 0L; case ID_SM_REFCOUNT: plvdi->item.pszText = pMaterial->refCountBuff; return 0L; default: break; } break; } break; case WM_COMMAND: switch ( wID ) { case IDM_OPTIONS_REFRESH: ShowMaterials_Refresh(); return 0L; case IDM_OPTIONS_EXPORT: ShowMaterials_Export(); return 0L; case IDM_OPTIONS_CURRENTFRAME: g_showMaterials_currentFrame ^= 1; ShowMaterials_SetTitle(); ShowMaterials_Refresh(); return 0L; } break; } return ( DefWindowProc( hwnd, message, wParam, lParam ) ); } //----------------------------------------------------------------------------- // ShowMaterials_Init // //----------------------------------------------------------------------------- bool ShowMaterials_Init() { // set up our window class WNDCLASS wndclass; memset( &wndclass, 0, sizeof( wndclass ) ); wndclass.style = 0; wndclass.lpfnWndProc = ShowMaterials_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_SHOWMATERIALS ); wndclass.lpszClassName = "SHOWMATERIALSCLASS"; if ( !RegisterClass( &wndclass ) ) return false; ShowMaterials_LoadConfig(); return true; } //----------------------------------------------------------------------------- // ShowMaterials_Open // //----------------------------------------------------------------------------- void ShowMaterials_Open() { RECT clientRect; HWND hWnd; int i; if ( g_showMaterials_hWnd ) { // only one instance if ( IsIconic( g_showMaterials_hWnd ) ) ShowWindow( g_showMaterials_hWnd, SW_RESTORE ); SetForegroundWindow( g_showMaterials_hWnd ); return; } hWnd = CreateWindowEx( WS_EX_CLIENTEDGE, "SHOWMATERIALSCLASS", "", WS_POPUP|WS_CAPTION|WS_SYSMENU|WS_SIZEBOX|WS_MINIMIZEBOX|WS_MAXIMIZEBOX, 0, 0, 700, 400, g_hDlgMain, NULL, g_hInstance, NULL ); g_showMaterials_hWnd = hWnd; GetClientRect( g_showMaterials_hWnd, &clientRect ); hWnd = CreateWindow( WC_LISTVIEW, "", WS_VISIBLE|WS_CHILD|LVS_REPORT, 0, 0, clientRect.right-clientRect.left, clientRect.bottom-clientRect.top, g_showMaterials_hWnd, ( HMENU )ID_SHOWMATERIALS_LISTVIEW, g_hInstance, NULL ); g_showMaterials_hWndListView = hWnd; // init list view columns for ( i=0; i