summaryrefslogtreecommitdiff
path: root/utils/hlfaceposer/VGuiWnd.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/VGuiWnd.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'utils/hlfaceposer/VGuiWnd.cpp')
-rw-r--r--utils/hlfaceposer/VGuiWnd.cpp324
1 files changed, 324 insertions, 0 deletions
diff --git a/utils/hlfaceposer/VGuiWnd.cpp b/utils/hlfaceposer/VGuiWnd.cpp
new file mode 100644
index 0000000..3e49c43
--- /dev/null
+++ b/utils/hlfaceposer/VGuiWnd.cpp
@@ -0,0 +1,324 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+#include "cbase.h"
+#include "vguiwnd.h"
+#include <vgui_controls/EditablePanel.h>
+#include "vgui/ISurface.h"
+#include "vgui/IVGui.h"
+#include "VGuiMatSurface/IMatSystemSurface.h"
+#include "FacePoser_VGui.h"
+// #include "material.h"
+#include "materialsystem/imaterialvar.h"
+#include "materialsystem/imaterial.h"
+
+#define REPAINT_TIMER_ID 1042 //random value, hopfully no collisions
+
+inline MaterialSystem_Config_t& MaterialSystemConfig()
+{
+ extern MaterialSystem_Config_t g_materialSystemConfig;
+ return g_materialSystemConfig;
+}
+
+inline IMaterialSystemHardwareConfig* MaterialSystemHardwareConfig()
+{
+ extern IMaterialSystemHardwareConfig* g_pMaterialSystemHardwareConfig;
+ return g_pMaterialSystemHardwareConfig;
+}
+
+class CBaseMainPanel : public vgui::EditablePanel
+{
+public:
+
+ CBaseMainPanel(Panel *parent, const char *panelName) : vgui::EditablePanel( parent, panelName ) {};
+
+ virtual void OnSizeChanged(int newWide, int newTall)
+ {
+ // call Panel and not EditablePanel OnSizeChanged.
+ Panel::OnSizeChanged(newWide, newTall);
+ }
+};
+
+int CVGuiPanelWnd::handleEvent( mxEvent *event )
+{
+ if ( !HandeEventVGui( event ) )
+ {
+ return BaseClass::handleEvent( event );
+ }
+
+ return 1;
+}
+
+CVGuiWnd::CVGuiWnd(void)
+{
+ m_pMainPanel = NULL;
+ m_pParentWnd = NULL;
+ m_hVGuiContext = vgui::DEFAULT_VGUI_CONTEXT;
+ m_bIsDrawing = false;
+ m_ClearColor.SetColor( 0,0,0,255 );
+ m_bClearZBuffer = true;
+}
+
+CVGuiWnd::~CVGuiWnd(void)
+{
+ if ( FaceposerVGui()->HasFocus( this ) )
+ {
+ FaceposerVGui()->SetFocus( NULL );
+ }
+
+ if ( m_hVGuiContext != vgui::DEFAULT_VGUI_CONTEXT )
+ {
+ vgui::ivgui()->DestroyContext( m_hVGuiContext );
+ m_hVGuiContext = vgui::DEFAULT_VGUI_CONTEXT;
+ }
+
+ // kill the timer if any
+ ::KillTimer( (HWND)m_pParentWnd->getHandle(), REPAINT_TIMER_ID );
+
+
+ if ( m_pMainPanel )
+ m_pMainPanel->MarkForDeletion();
+}
+
+void CVGuiWnd::SetParentWindow(mxWindow *pParent)
+{
+ m_pParentWnd = pParent;
+
+ /*
+ m_pParentWnd->EnableWindow( true );
+ m_pParentWnd->SetFocus();
+ */
+
+ HWND h = (HWND)m_pParentWnd->getHandle();
+ EnableWindow( h, TRUE );
+ SetFocus( h );
+}
+
+int CVGuiWnd::GetVGuiContext()
+{
+ return m_hVGuiContext;
+}
+
+void CVGuiWnd::SetCursor(vgui::HCursor cursor)
+{
+ if ( m_pMainPanel )
+ {
+ m_pMainPanel->SetCursor( cursor );
+ }
+}
+
+void CVGuiWnd::SetCursor(const char *filename)
+{
+ vgui::HCursor hCursor = vgui::surface()->CreateCursorFromFile( filename );
+ m_pMainPanel->SetCursor( hCursor );
+}
+
+void CVGuiWnd::SetMainPanel( vgui::EditablePanel * pPanel )
+{
+ SetRepaintInterval( 75 );
+
+ Assert( m_pMainPanel == NULL );
+ Assert( m_hVGuiContext == vgui::DEFAULT_VGUI_CONTEXT );
+
+ m_pMainPanel = pPanel;
+
+ m_pMainPanel->SetParent( vgui::surface()->GetEmbeddedPanel() );
+ m_pMainPanel->SetVisible( true );
+ m_pMainPanel->SetPaintBackgroundEnabled( false );
+ m_pMainPanel->SetCursor( vgui::dc_arrow );
+
+ m_hVGuiContext = vgui::ivgui()->CreateContext();
+ vgui::ivgui()->AssociatePanelWithContext( m_hVGuiContext, m_pMainPanel->GetVPanel() );
+}
+
+vgui::EditablePanel *CVGuiWnd::CreateDefaultPanel()
+{
+ return new CBaseMainPanel( NULL, "mainpanel" );
+}
+
+vgui::EditablePanel *CVGuiWnd::GetMainPanel()
+{
+ return m_pMainPanel;
+}
+
+mxWindow *CVGuiWnd::GetParentWnd()
+{
+ return m_pParentWnd;
+}
+
+void CVGuiWnd::SetRepaintInterval( int msecs )
+{
+ m_pParentWnd->setTimer( msecs );
+}
+
+void CVGuiWnd::DrawVGuiPanel()
+{
+ if ( !m_pMainPanel || !m_pParentWnd || m_bIsDrawing )
+ return;
+
+
+ m_bIsDrawing = true; // avoid recursion
+
+ HWND hWnd = (HWND)m_pParentWnd->getHandle();
+
+ int w,h;
+ RECT rect;
+ ::GetClientRect(hWnd, &rect);
+ CMatRenderContextPtr pRenderContext( g_pMaterialSystem );
+
+ g_pMaterialSystem->SetView( hWnd );
+
+ pRenderContext->Viewport( rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top );
+
+ pRenderContext->ClearColor4ub( m_ClearColor.r(), m_ClearColor.g(), m_ClearColor.b(), m_ClearColor.a() );
+
+ pRenderContext->ClearBuffers( true, m_bClearZBuffer );
+
+ g_pMaterialSystem->BeginFrame( 0 );
+
+ // draw from the main panel down
+
+ m_pMainPanel->GetSize( w , h );
+
+ if ( w != rect.right || h != rect.bottom )
+ {
+ m_pMainPanel->SetBounds( 2 + rect.left, 2 + rect.top, rect.right - rect.left - 4, rect.bottom - rect.top - 4 );
+ m_pMainPanel->Repaint();
+ }
+
+ FaceposerVGui()->Simulate();
+
+ vgui::surface()->PaintTraverseEx( m_pMainPanel->GetVPanel(), true );
+
+ g_pMaterialSystem->EndFrame();
+
+ g_pMaterialSystem->SwapBuffers();
+
+ m_bIsDrawing = false;
+}
+
+CVGuiPanelWnd::CVGuiPanelWnd( mxWindow *parent, int x, int y, int w, int h )
+: BaseClass( parent, x, y, w, h )
+{
+}
+
+void CVGuiPanelWnd::redraw()
+{
+ DrawVGuiPanel();
+}
+
+int CVGuiWnd::HandeEventVGui( mxEvent *event )
+{
+ if ( !m_pParentWnd )
+ return 0;
+
+ HWND hWnd = (HWND)m_pParentWnd->getHandle();
+
+// switch( uMsg )
+// {
+
+// case WM_GETDLGCODE :
+// {
+// // forward all keyboard into to vgui panel
+// return DLGC_WANTALLKEYS|DLGC_WANTCHARS;
+// }
+
+// case WM_PAINT :
+// {
+// // draw the VGUI panel now
+// DrawVGuiPanel();
+// break;
+// }
+
+// case WM_TIMER :
+// {
+// if ( wParam == REPAINT_TIMER_ID )
+// {
+// m_pParentWnd->Invalidate();
+// }
+// break;
+// }
+
+// case WM_SETCURSOR:
+// return 1; // don't pass WM_SETCURSOR
+
+/*
+ case WM_LBUTTONDOWN:
+ case WM_RBUTTONDOWN:
+ case WM_MBUTTONDOWN:
+ case WM_MOUSEMOVE:
+ {
+ // switch vgui focus to this panel
+ FaceposerVGui()->SetFocus( this );
+
+ // request keyboard focus too on mouse down
+ if ( uMsg != WM_MOUSEMOVE)
+ {
+ m_pParentWnd->Invalidate();
+ m_pParentWnd->SetFocus();
+ }
+ break;
+ }
+ case WM_KILLFOCUS:
+ {
+ // restore normal arrow cursor when mouse leaves VGUI panel
+ SetCursor( vgui::dc_arrow );
+ break;
+ }
+
+ case WM_LBUTTONUP:
+ case WM_RBUTTONUP:
+ case WM_MBUTTONUP:
+ case WM_LBUTTONDBLCLK:
+ case WM_RBUTTONDBLCLK:
+ case WM_MBUTTONDBLCLK:
+ case WM_MOUSEWHEEL:
+ case WM_KEYDOWN:
+ case WM_SYSKEYDOWN:
+ case WM_SYSCHAR:
+ case WM_CHAR:
+ case WM_KEYUP:
+ case WM_SYSKEYUP:
+ {
+ // redraw window
+ m_pParentWnd->Invalidate();
+ break;
+ }
+ }
+*/
+
+ switch ( event->event )
+ {
+ case mxEvent::KeyUp:
+ case mxEvent::KeyDown:
+ case mxEvent::MouseUp:
+ case mxEvent::MouseWheeled:
+ case mxEvent::Char:
+ case mxEvent::MouseMove:
+ {
+ InvalidateRect( hWnd, NULL, FALSE );
+ }
+ break;
+
+ case mxEvent::Timer:
+ {
+ InvalidateRect( hWnd, NULL, FALSE );
+ }
+ break;
+ case mxEvent::Focus:
+ break;
+ case mxEvent::MouseDown:
+ {
+ // switch vgui focus to this panel
+ FaceposerVGui()->SetFocus( this );
+
+ // request keyboard focus too on mouse down
+ if ( event->event != mxEvent::MouseMove )
+ {
+ InvalidateRect( hWnd, NULL, FALSE );
+ SetFocus( hWnd );
+ }
+ }
+ break;
+ }
+
+ return 0;
+} \ No newline at end of file