mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-23 06:36:54 +00:00
576 lines
16 KiB
C++
576 lines
16 KiB
C++
//========= 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; i<g_showMaterials_numMaterials; i++ )
|
|
{
|
|
free( g_showMaterials_pMaterials[i].pName );
|
|
free( g_showMaterials_pMaterials[i].pShaderName );
|
|
}
|
|
|
|
g_showMaterials_pMaterials = NULL;
|
|
g_showMaterials_numMaterials = 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// ShowMaterials_Export
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
void ShowMaterials_Export()
|
|
{
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// ShowMaterials_SetTitle
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
void ShowMaterials_SetTitle()
|
|
{
|
|
char titleBuff[128];
|
|
|
|
if ( g_showMaterials_hWnd )
|
|
{
|
|
strcpy( titleBuff, "Materials " );
|
|
if ( g_showMaterials_currentFrame )
|
|
strcat( titleBuff, " [FRAME]" );
|
|
|
|
SetWindowText( g_showMaterials_hWnd, titleBuff );
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// ShowMaterials_CompareFunc
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
int CALLBACK ShowMaterials_CompareFunc( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort )
|
|
{
|
|
material_t* pMaterialA = ( material_t* )lParam1;
|
|
material_t* pMaterialB = ( material_t* )lParam2;
|
|
|
|
int sort = 0;
|
|
switch ( g_showMaterials_sortColumn )
|
|
{
|
|
case ID_SM_NAME:
|
|
sort = stricmp( pMaterialA->pName, 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; i<itemCount; i++ )
|
|
{
|
|
lvitem.iItem = i;
|
|
ListView_GetItem( g_showMaterials_hWndListView, &lvitem );
|
|
|
|
pMaterial = ( material_t* )lvitem.lParam;
|
|
pMaterial->listIndex = i;
|
|
}
|
|
|
|
// update list view columns with sort key
|
|
for ( i=0; i<sizeof( g_showMaterials_Labels )/sizeof( g_showMaterials_Labels[0] ); i++ )
|
|
{
|
|
char symbol;
|
|
LVCOLUMN lvc;
|
|
|
|
if ( i == g_showMaterials_sortColumn )
|
|
symbol = g_showMaterials_sortDescending ? '<' : '>';
|
|
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<sizeof( g_showMaterials_Labels )/sizeof( g_showMaterials_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_showMaterials_Labels[i].width;
|
|
lvc.fmt = LVCFMT_LEFT;
|
|
lvc.pszText = ( LPSTR )g_showMaterials_Labels[i].name;
|
|
|
|
ListView_InsertColumn( g_showMaterials_hWndListView, i, &lvc );
|
|
}
|
|
|
|
ListView_SetBkColor( g_showMaterials_hWndListView, g_backgroundColor );
|
|
ListView_SetTextBkColor( g_showMaterials_hWndListView, g_backgroundColor );
|
|
|
|
DWORD style = LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP;
|
|
ListView_SetExtendedListViewStyleEx( g_showMaterials_hWndListView, style, style );
|
|
|
|
// populate list view
|
|
for ( i=0; i<g_showMaterials_numMaterials; i++ )
|
|
ShowMaterials_AddViewItem( &g_showMaterials_pMaterials[i] );
|
|
ShowMaterials_SortItems();
|
|
|
|
ShowMaterials_SetTitle();
|
|
|
|
if ( g_showMaterials_windowRect.right && g_showMaterials_windowRect.bottom )
|
|
MoveWindow( g_showMaterials_hWnd, g_showMaterials_windowRect.left, g_showMaterials_windowRect.top, g_showMaterials_windowRect.right-g_showMaterials_windowRect.left, g_showMaterials_windowRect.bottom-g_showMaterials_windowRect.top, FALSE );
|
|
ShowWindow( g_showMaterials_hWnd, SHOW_OPENWINDOW );
|
|
|
|
// get data from application
|
|
ShowMaterials_Refresh();
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// rc_MaterialList
|
|
//
|
|
// Sent from application with material list
|
|
//-----------------------------------------------------------------------------
|
|
int rc_MaterialList( char* commandPtr )
|
|
{
|
|
char* cmdToken;
|
|
int numMaterials;
|
|
int materialList;
|
|
int retAddr;
|
|
int retVal;
|
|
int errCode = -1;
|
|
xrMaterial_t* pLocalList;
|
|
|
|
// remove old entries
|
|
ShowMaterials_Clear();
|
|
|
|
// get number of materials
|
|
cmdToken = GetToken( &commandPtr );
|
|
if ( !cmdToken[0] )
|
|
goto cleanUp;
|
|
sscanf( cmdToken, "%x", &numMaterials );
|
|
|
|
// get material list
|
|
cmdToken = GetToken( &commandPtr );
|
|
if ( !cmdToken[0] )
|
|
goto cleanUp;
|
|
sscanf( cmdToken, "%x", &materialList );
|
|
|
|
// get retAddr
|
|
cmdToken = GetToken( &commandPtr );
|
|
if ( !cmdToken[0] )
|
|
goto cleanUp;
|
|
sscanf( cmdToken, "%x", &retAddr );
|
|
|
|
pLocalList = new xrMaterial_t[numMaterials];
|
|
memset( pLocalList, 0, numMaterials*sizeof( xrMaterial_t ) );
|
|
|
|
g_showMaterials_numMaterials = numMaterials;
|
|
g_showMaterials_pMaterials = new material_t[numMaterials];
|
|
memset( g_showMaterials_pMaterials, 0, numMaterials*sizeof( material_t ) );
|
|
|
|
// get the caller's command list
|
|
DmGetMemory( ( void* )materialList, numMaterials*sizeof( xrMaterial_t ), pLocalList, NULL );
|
|
|
|
// build out the resident list
|
|
for ( int i=0; i<numMaterials; i++ )
|
|
{
|
|
// swap the structure
|
|
pLocalList[i].refCount = BigDWord( pLocalList[i].refCount );
|
|
|
|
g_showMaterials_pMaterials[i].pName = strdup( pLocalList[i].nameString );
|
|
g_showMaterials_pMaterials[i].pShaderName = strdup( pLocalList[i].shaderString );
|
|
g_showMaterials_pMaterials[i].refCount = pLocalList[i].refCount;
|
|
|
|
// add to list view
|
|
ShowMaterials_AddViewItem( &g_showMaterials_pMaterials[i] );
|
|
}
|
|
|
|
// return the result
|
|
retVal = numMaterials;
|
|
int xboxRetVal = BigDWord( retVal );
|
|
DmSetMemory( ( void* )retAddr, sizeof( int ), &xboxRetVal, NULL );
|
|
|
|
DebugCommand( "0x%8.8x = MaterialList( 0x%8.8x, 0x%8.8x )\n", retVal, numMaterials, materialList );
|
|
|
|
delete [] pLocalList;
|
|
|
|
// update
|
|
ShowMaterials_SortItems();
|
|
|
|
// success
|
|
errCode = 0;
|
|
|
|
cleanUp:
|
|
return ( errCode );
|
|
}
|