summaryrefslogtreecommitdiff
path: root/utils/hlfaceposer/phonemeproperties.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /utils/hlfaceposer/phonemeproperties.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'utils/hlfaceposer/phonemeproperties.cpp')
-rw-r--r--utils/hlfaceposer/phonemeproperties.cpp434
1 files changed, 434 insertions, 0 deletions
diff --git a/utils/hlfaceposer/phonemeproperties.cpp b/utils/hlfaceposer/phonemeproperties.cpp
new file mode 100644
index 0000000..c1e2da2
--- /dev/null
+++ b/utils/hlfaceposer/phonemeproperties.cpp
@@ -0,0 +1,434 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+#include "hlfaceposer.h"
+#include <mxtk/mx.h>
+#include "resource.h"
+#include "PhonemeProperties.h"
+#include "expressions.h"
+#include "expclass.h"
+#include "mdlviewer.h"
+
+static CPhonemeParams g_Params;
+
+static int g_nPhonemeCount = 0;
+static HWND *g_rgButtons = NULL;
+
+#define IDC_PHONEME 2000
+
+#define PHONEME_WIDTH 50
+#define PHONEME_HEIGHT 18
+#define PHONEME_GAP 10
+#define PHONEME_VGAP 5
+
+typedef long (__stdcall *WINPROCTYPE)( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
+static WINPROCTYPE lpfnOldButtonProc;
+
+static BOOL CALLBACK PhonemeBtnProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ switch ( uMsg )
+ {
+ case WM_MOUSEMOVE:
+ {
+ HWND dialog = GetParent( hwnd );
+ if ( dialog )
+ {
+ // Get the hint text item
+ HWND helpText = GetDlgItem( dialog, IDC_STATIC_HELPTEXT );
+ if ( helpText )
+ {
+ CExpression *exp = ( CExpression * )GetWindowLong( (HWND)hwnd, GWL_USERDATA );
+ if ( exp )
+ {
+ SendMessage( helpText, WM_SETTEXT, 0, (LPARAM)exp->description );
+ }
+ }
+ }
+ }
+ return 0;
+ default:
+ break;
+ }
+
+ return CallWindowProc( lpfnOldButtonProc, hwnd, uMsg, wParam, lParam );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : phoneme -
+// Output : static void
+//-----------------------------------------------------------------------------
+static void ClickedPhoneme( HWND hwndDlg, int phoneme )
+{
+ HWND ctrl = GetDlgItem( hwndDlg, IDC_EDIT_PHONEME );
+ if ( !ctrl )
+ return;
+
+ if ( !g_Params.m_bMultiplePhoneme )
+ {
+ g_Params.m_szName[ 0 ] = 0;
+ }
+ else
+ {
+ SendMessage( ctrl, WM_GETTEXT, (WPARAM)sizeof( g_Params.m_szName ), (LPARAM)g_Params.m_szName );
+ }
+ if ( phoneme >= g_nPhonemeCount || phoneme < 0 )
+ {
+ Assert( 0 );
+ return;
+ }
+
+ HWND button = g_rgButtons[ phoneme ];
+ CExpression *exp = ( CExpression * )GetWindowLong( (HWND)button, GWL_USERDATA );
+ if ( exp )
+ {
+ if ( strlen( g_Params.m_szName ) > 0 )
+ {
+ strcat( g_Params.m_szName, " " );
+ }
+ strcat( g_Params.m_szName, exp->name );
+
+ if ( g_Params.m_bMultiplePhoneme )
+ {
+ SetFocus( ctrl );
+ SendMessage( ctrl, WM_SETTEXT, 0, (LPARAM)g_Params.m_szName );
+ SendMessage( ctrl, EM_SETSEL, 0, MAKELONG(0, 0xffff) );
+ }
+ }
+}
+
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : hwndDlg -
+// Output : static void
+//-----------------------------------------------------------------------------
+static void CreateAndLayoutControls( HWND hwndDlg, CPhonemeParams* params )
+{
+ g_nPhonemeCount = 0;
+ // Find phomemes
+ // Make sure phonemes are loaded
+ FacePoser_EnsurePhonemesLoaded();
+
+ CExpClass *cl = expressions->FindClass( "phonemes", true );
+ if ( !cl )
+ return;
+
+ g_nPhonemeCount = cl->GetNumExpressions();
+ if ( g_nPhonemeCount == 0 )
+ return;
+
+ g_rgButtons = new HWND[ g_nPhonemeCount ];
+ Assert( g_rgButtons );
+
+ int columns = 7;
+ int rows = ( g_nPhonemeCount / columns ) + 1;
+
+ int dialogW = columns * ( PHONEME_WIDTH + PHONEME_GAP ) + 2 * PHONEME_GAP;
+ int dialogH = rows * ( PHONEME_HEIGHT + PHONEME_VGAP ) + 40 + 55 + 30;
+
+ int startx = PHONEME_GAP;
+ int starty = 40;
+
+ if ( params->m_bPositionDialog )
+ {
+ int top = params->m_nTop - dialogH - 5;
+ int left = params->m_nLeft;
+
+ MoveWindow( hwndDlg,
+ left,
+ top,
+ dialogW,
+ dialogH,
+ TRUE );
+ }
+ else
+ {
+ MoveWindow( hwndDlg,
+ ( GetSystemMetrics( SM_CXFULLSCREEN ) - dialogW ) / 2,
+ ( GetSystemMetrics( SM_CYFULLSCREEN ) - dialogH ) / 2,
+ dialogW,
+ dialogH,
+ TRUE );
+ }
+
+ HWND ctrl = GetDlgItem( hwndDlg, IDOK );
+ if ( ctrl )
+ {
+ MoveWindow( ctrl, dialogW - 220, dialogH - 58, 100, 20, TRUE );
+ }
+ ctrl = GetDlgItem( hwndDlg, IDCANCEL );
+ if ( ctrl )
+ {
+ MoveWindow( ctrl, dialogW - 110, dialogH - 58, 100, 20, TRUE );
+ }
+ ctrl = GetDlgItem( hwndDlg, IDC_PHONEMETEXTPROMPT );
+ if ( ctrl )
+ {
+ MoveWindow( ctrl, startx, dialogH - 55, 50, 20, TRUE );
+ }
+ ctrl = GetDlgItem( hwndDlg, IDC_EDIT_PHONEME );
+ if ( ctrl )
+ {
+ MoveWindow( ctrl, startx + 50, dialogH - 58, 100, 20, TRUE );
+ }
+ ctrl = GetDlgItem( hwndDlg, IDC_STATIC_HELPTEXT );
+ if ( ctrl )
+ {
+ MoveWindow( ctrl, startx, dialogH - 85, dialogW - startx - 20, 20, TRUE );
+ }
+
+ int r = 0;
+ int c = 0;
+ for ( int i = 0; i < g_nPhonemeCount; i++ )
+ {
+ CExpression *exp = cl->GetExpression( i );
+ if ( !exp )
+ continue;
+
+ HWND button = CreateWindowEx(
+ 0,
+ "BUTTON",
+ va( "%s", exp->name ),
+ WS_CHILD | WS_VISIBLE | BS_LEFT,
+ startx + c * ( PHONEME_WIDTH + PHONEME_GAP ),
+ starty + r * ( PHONEME_HEIGHT + PHONEME_VGAP ),
+ PHONEME_WIDTH,
+ PHONEME_HEIGHT,
+ hwndDlg,
+ (HMENU)( IDC_PHONEME + i ),
+ (HINSTANCE)GetModuleHandle( 0 ),
+ NULL );
+ Assert( button );
+ SetWindowLong( (HWND)button, GWL_USERDATA, (LONG)exp );
+
+ // Subclass it
+ lpfnOldButtonProc = (WINPROCTYPE)SetWindowLong( (HWND)button, GWL_WNDPROC, (LONG)PhonemeBtnProc );
+
+ SendMessage ((HWND)button, WM_SETFONT, (WPARAM) (HFONT) GetStockObject (ANSI_VAR_FONT), MAKELPARAM (TRUE, 0));
+
+ g_rgButtons[ i ] = button;
+
+ c++;
+ if ( c >= columns )
+ {
+ r++;
+ c = 0;
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : hwndDlg -
+// Output : static void
+//-----------------------------------------------------------------------------
+static void DestroyControls( HWND hwndDlg )
+{
+ for ( int i = 0 ; i < g_nPhonemeCount; i++ )
+ {
+ if ( g_rgButtons[ i ] )
+ {
+ DestroyWindow( g_rgButtons[ i ] );
+ g_rgButtons[ i ] = NULL;
+ }
+ }
+
+ delete[] g_rgButtons;
+ g_nPhonemeCount = 0;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : hwndDlg -
+// Output : static void
+//-----------------------------------------------------------------------------
+static void PhonemePropertiesDialogExit( HWND hwndDlg, int exitCode )
+{
+ DestroyControls( hwndDlg );
+
+ EndDialog( hwndDlg, exitCode );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : allowmultiple -
+// *input -
+// *output -
+// Output : static bool
+//-----------------------------------------------------------------------------
+static bool ValidatePhonemeString( bool allowmultiple, char const *input, char *output )
+{
+ // Make sure phonemes are loaded
+ FacePoser_EnsurePhonemesLoaded();
+
+ CExpClass *cl = expressions->FindClass( "phonemes", true );
+ if ( !cl )
+ return false;
+
+ if ( !input || !input[ 0 ] )
+ return false;
+
+ // Go one by one
+ int count = 1;
+ char phoneme[ 128 ];
+ char *in, *out;
+
+ *output = 0;
+
+ in = (char *)input;
+ do
+ {
+ out = phoneme;
+
+ while ( *in > 32 )
+ {
+ *out++ = *in++;
+ }
+ *out = 0;
+
+ // Validate phoneme entered
+ for ( int i = 0; i < g_nPhonemeCount; i++ )
+ {
+ CExpression *exp = cl->GetExpression( i );
+ if ( !exp )
+ continue;
+
+ if ( !stricmp( exp->name, phoneme ) )
+ {
+ // Found it
+ if ( count != 1 )
+ {
+ strcat( output, " " );
+ }
+ strcat( output, phoneme );
+ break;
+ }
+ }
+
+ if ( !*in )
+ break;
+
+ // Skip whitespace
+ in++;
+ count++;
+
+ // Only keep first one
+ if ( !allowmultiple )
+ break;
+
+ } while ( 1 );
+
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : hwndDlg -
+// uMsg -
+// wParam -
+// lParam -
+// Output : static BOOL CALLBACK
+//-----------------------------------------------------------------------------
+static BOOL CALLBACK PhonemePropertiesDialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
+{
+ switch(uMsg)
+ {
+ case WM_INITDIALOG:
+ // Insert code here to put the string (to find and replace with)
+ // into the edit controls.
+ // ...
+ {
+ g_Params.PositionSelf( hwndDlg );
+
+ SetWindowText( hwndDlg, g_Params.m_szDialogTitle );
+
+ CreateAndLayoutControls( hwndDlg, &g_Params );
+
+ HWND control = GetDlgItem( hwndDlg, IDC_PHONEMENAME );
+ if ( control )
+ {
+ SendMessage( control, WM_SETTEXT , 0,
+ ( LPARAM )(
+ g_Params.m_bMultiplePhoneme ?
+ "Click or enter one or more phonemes from list below"
+ :
+ va( "Phoneme/Viseme: %s", g_Params.m_szName ) ) );
+ }
+
+ control = GetDlgItem( hwndDlg, IDC_EDIT_PHONEME );
+ if ( control )
+ {
+ SetFocus( control );
+ SendMessage( control, WM_SETTEXT , 0, ( LPARAM )g_Params.m_szName );
+ SendMessage( control, EM_SETSEL, 0, MAKELONG(0, 0xffff) );
+ return FALSE;
+ }
+ }
+ return TRUE;
+
+ case WM_COMMAND:
+ {
+ int cmd = LOWORD( wParam );
+
+ if ( ( cmd >= IDC_PHONEME ) &&
+ ( cmd < ( IDC_PHONEME + g_nPhonemeCount ) ) )
+ {
+ ClickedPhoneme( hwndDlg, cmd - IDC_PHONEME );
+ if ( !g_Params.m_bMultiplePhoneme )
+ {
+ PhonemePropertiesDialogExit( hwndDlg, 1 );
+ }
+ }
+ else if ( cmd != IDC_EDIT_PHONEME )
+ {
+ switch ( cmd )
+ {
+ case IDOK:
+ {
+ // Retrieve text
+ char szPhoneme[ 256 ];
+ HWND ctrl = GetDlgItem( hwndDlg, IDC_EDIT_PHONEME );
+ if ( ctrl )
+ {
+ SendMessage( ctrl, WM_GETTEXT, (WPARAM)sizeof( szPhoneme ), (LPARAM)szPhoneme );
+
+ ValidatePhonemeString( g_Params.m_bMultiplePhoneme, szPhoneme, g_Params.m_szName );
+ }
+ PhonemePropertiesDialogExit( hwndDlg, 1 );
+ }
+ break;
+ case IDCANCEL:
+ PhonemePropertiesDialogExit( hwndDlg, 0 );
+ break;
+ }
+ }
+ }
+ return TRUE;
+ }
+ return FALSE;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *view -
+// *actor -
+// Output : int
+//-----------------------------------------------------------------------------
+int PhonemeProperties( CPhonemeParams *params )
+{
+ g_Params = *params;
+
+ int retval = DialogBox( (HINSTANCE)GetModuleHandle( 0 ),
+ MAKEINTRESOURCE( IDD_PHONEMEPROPERTIES ),
+ (HWND)g_MDLViewer->getHandle(),
+ (DLGPROC)PhonemePropertiesDialogProc );
+
+ *params = g_Params;
+
+ return retval;
+} \ No newline at end of file