mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-23 14:46:53 +00:00
311 lines
7.0 KiB
C++
311 lines
7.0 KiB
C++
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================//
|
||
|
#include <mxtk/mx.h>
|
||
|
#include "mxStatusWindow.h"
|
||
|
#include "hlfaceposer.h"
|
||
|
#include "choreowidgetdrawhelper.h"
|
||
|
#include "MDLViewer.h"
|
||
|
#include "faceposertoolwindow.h"
|
||
|
|
||
|
extern double realtime;
|
||
|
|
||
|
mxStatusWindow *g_pStatusWindow = NULL;
|
||
|
|
||
|
#define STATUS_SCROLLBAR_SIZE 12
|
||
|
#define STATUS_FONT_SIZE 9
|
||
|
|
||
|
mxStatusWindow::mxStatusWindow(mxWindow *parent, int x, int y, int w, int h, const char *label /*= 0*/ )
|
||
|
: mxWindow( parent, x, y, w, h, label ), IFacePoserToolWindow( "Status Window", "Output" ), m_pScrollbar(NULL)
|
||
|
{
|
||
|
for ( int i = 0; i < MAX_TEXT_LINES; i++ )
|
||
|
{
|
||
|
m_rgTextLines[ i ].m_szText[ 0 ] = 0;
|
||
|
m_rgTextLines[ i ].rgb = CONSOLE_COLOR;
|
||
|
m_rgTextLines[ i ].curtime = 0;
|
||
|
}
|
||
|
m_nCurrentLine = 0;
|
||
|
|
||
|
m_pScrollbar = new mxScrollbar( this, 0, 0, STATUS_SCROLLBAR_SIZE, 100, IDC_STATUS_SCROLL, mxScrollbar::Vertical );
|
||
|
m_pScrollbar->setRange( 0, 1000 );
|
||
|
m_pScrollbar->setPagesize( 100 );
|
||
|
}
|
||
|
|
||
|
mxStatusWindow::~mxStatusWindow()
|
||
|
{
|
||
|
g_pStatusWindow = NULL;
|
||
|
}
|
||
|
|
||
|
void mxStatusWindow::redraw()
|
||
|
{
|
||
|
// if ( !ToolCanDraw() )
|
||
|
// return;
|
||
|
|
||
|
if ( !m_pScrollbar )
|
||
|
return;
|
||
|
|
||
|
CChoreoWidgetDrawHelper helper( this, RGB( 0, 0, 0 ) );
|
||
|
HandleToolRedraw( helper );
|
||
|
|
||
|
RECT rc;
|
||
|
helper.GetClientRect( rc );
|
||
|
|
||
|
RECT rcText = rc;
|
||
|
|
||
|
int lineheight = ( STATUS_FONT_SIZE + 2 );
|
||
|
|
||
|
InflateRect( &rcText, -4, 0 );
|
||
|
rcText.bottom = h2() - 4;
|
||
|
rcText.top = rcText.bottom - lineheight;
|
||
|
|
||
|
//int minval = m_pScrollbar->getMinValue();
|
||
|
int maxval = m_pScrollbar->getMaxValue();
|
||
|
int pagesize = m_pScrollbar->getPagesize();
|
||
|
int curval = m_pScrollbar->getValue();
|
||
|
|
||
|
int offset = ( maxval - pagesize ) - curval;
|
||
|
offset = ( offset + lineheight - 1 ) / lineheight;
|
||
|
|
||
|
offset = max( 0, offset );
|
||
|
//offset = 0;
|
||
|
//offset += 10;
|
||
|
//offset = max( 0, offset );
|
||
|
|
||
|
for ( int i = 0; i < MAX_TEXT_LINES - offset; i++ )
|
||
|
{
|
||
|
int rawline = m_nCurrentLine - i - 1;
|
||
|
if ( rawline <= 0 )
|
||
|
continue;
|
||
|
|
||
|
if ( rcText.bottom < 0 )
|
||
|
break;
|
||
|
|
||
|
int line = ( rawline - offset ) & TEXT_LINE_MASK;
|
||
|
|
||
|
char *ptext = m_rgTextLines[ line ].m_szText;
|
||
|
|
||
|
RECT rcTime = rcText;
|
||
|
rcTime.right = rcTime.left + 50;
|
||
|
|
||
|
char sz[ 32 ];
|
||
|
sprintf( sz, "%.3f", m_rgTextLines[ line ].curtime );
|
||
|
|
||
|
int len = helper.CalcTextWidth( "Arial", STATUS_FONT_SIZE, FW_NORMAL, sz );
|
||
|
|
||
|
rcTime.left = rcTime.right - len - 5;
|
||
|
|
||
|
helper.DrawColoredText( "Arial", STATUS_FONT_SIZE, FW_NORMAL, RGB( 255, 255, 150 ), rcTime, sz );
|
||
|
|
||
|
rcTime = rcText;
|
||
|
rcTime.left += 50;
|
||
|
|
||
|
helper.DrawColoredText( "Arial", STATUS_FONT_SIZE, FW_NORMAL, m_rgTextLines[ line ].rgb, rcTime, ptext );
|
||
|
|
||
|
OffsetRect( &rcText, 0, -lineheight );
|
||
|
}
|
||
|
|
||
|
DrawActiveTool();
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
// Output : Returns true on success, false on failure.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool mxStatusWindow::PaintBackground( void )
|
||
|
{
|
||
|
redraw();
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
void mxStatusWindow::StatusPrint( COLORREF clr, bool overwrite, const char *text )
|
||
|
{
|
||
|
float curtime = (float)Plat_FloatTime();
|
||
|
|
||
|
char sz[32];
|
||
|
sprintf( sz, "%.3f ", curtime );
|
||
|
|
||
|
OutputDebugString( sz );
|
||
|
OutputDebugString( text );
|
||
|
|
||
|
char fixedtext[ 512 ];
|
||
|
char *in, *out;
|
||
|
in = (char *)text;
|
||
|
out = fixedtext;
|
||
|
|
||
|
int c = 0;
|
||
|
while ( *in && c < 511 )
|
||
|
{
|
||
|
if ( *in == '\n' || *in == '\r' )
|
||
|
{
|
||
|
in++;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
*out++ = *in++;
|
||
|
c++;
|
||
|
}
|
||
|
}
|
||
|
*out = 0;
|
||
|
|
||
|
if ( overwrite )
|
||
|
{
|
||
|
m_nCurrentLine--;
|
||
|
}
|
||
|
|
||
|
int i = m_nCurrentLine & TEXT_LINE_MASK;
|
||
|
|
||
|
strncpy( m_rgTextLines[ i ].m_szText, fixedtext, 511 );
|
||
|
m_rgTextLines[ i ].m_szText[ 511 ] = 0;
|
||
|
|
||
|
m_rgTextLines[ i ].rgb = clr;
|
||
|
m_rgTextLines[ i ].curtime = curtime;
|
||
|
|
||
|
m_nCurrentLine++;
|
||
|
|
||
|
if ( m_nCurrentLine <= MAX_TEXT_LINES )
|
||
|
{
|
||
|
PositionSliders( 0 );
|
||
|
}
|
||
|
m_pScrollbar->setValue( m_pScrollbar->getMaxValue() );
|
||
|
|
||
|
redraw();
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
// Input : sboffset -
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void mxStatusWindow::PositionSliders( int sboffset )
|
||
|
{
|
||
|
int lineheight = ( STATUS_FONT_SIZE + 2 );
|
||
|
|
||
|
int linesused = min( (int)MAX_TEXT_LINES, m_nCurrentLine );
|
||
|
linesused = max( linesused, 1 );
|
||
|
|
||
|
int trueh = h2() - GetCaptionHeight();
|
||
|
|
||
|
int vpixelsneeded = max( linesused * lineheight, trueh );
|
||
|
m_pScrollbar->setVisible( linesused * lineheight > trueh );
|
||
|
|
||
|
|
||
|
m_pScrollbar->setPagesize( trueh );
|
||
|
m_pScrollbar->setRange( 0, vpixelsneeded );
|
||
|
|
||
|
redraw();
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
// Input : *event -
|
||
|
// Output : int
|
||
|
//-----------------------------------------------------------------------------
|
||
|
int mxStatusWindow::handleEvent( mxEvent *event )
|
||
|
{
|
||
|
int iret = 0;
|
||
|
|
||
|
if ( HandleToolEvent( event ) )
|
||
|
{
|
||
|
return iret;
|
||
|
}
|
||
|
|
||
|
switch ( event->event )
|
||
|
{
|
||
|
default:
|
||
|
break;
|
||
|
case mxEvent::Size:
|
||
|
{
|
||
|
m_pScrollbar->setBounds( w2() - STATUS_SCROLLBAR_SIZE, GetCaptionHeight(), STATUS_SCROLLBAR_SIZE, h2()-GetCaptionHeight() );
|
||
|
PositionSliders( 0 );
|
||
|
m_pScrollbar->setValue( m_pScrollbar->getMaxValue() );
|
||
|
iret = 1;
|
||
|
}
|
||
|
break;
|
||
|
case mxEvent::Action:
|
||
|
{
|
||
|
iret = 1;
|
||
|
switch ( event->action )
|
||
|
{
|
||
|
default:
|
||
|
iret = 0;
|
||
|
break;
|
||
|
case IDC_STATUS_SCROLL:
|
||
|
{
|
||
|
if ( event->event == mxEvent::Action &&
|
||
|
event->modifiers == SB_THUMBTRACK)
|
||
|
{
|
||
|
int offset = event->height;
|
||
|
m_pScrollbar->setValue( offset );
|
||
|
PositionSliders( offset );
|
||
|
DrawActiveTool();
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return iret;
|
||
|
}
|
||
|
#include "StudioModel.h"
|
||
|
|
||
|
#include "faceposer_models.h"
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void mxStatusWindow::DrawActiveTool()
|
||
|
{
|
||
|
RECT rcTool;
|
||
|
rcTool.left = 0;
|
||
|
rcTool.top = GetCaptionHeight() + 2;
|
||
|
rcTool.bottom = h2();
|
||
|
rcTool.right = w2() - 16;
|
||
|
|
||
|
rcTool.bottom = rcTool.top + 10;
|
||
|
rcTool.left = rcTool.right - 500;
|
||
|
|
||
|
char sz[ 256 ];
|
||
|
|
||
|
IFacePoserToolWindow *activeTool = IFacePoserToolWindow::GetActiveTool();
|
||
|
|
||
|
static float lastrealtime = 0.0f;
|
||
|
|
||
|
float dt = (float)realtime - lastrealtime;
|
||
|
dt = clamp( dt, 0.0f, 1.0f );
|
||
|
|
||
|
float fps = 0.0f;
|
||
|
if ( dt > 0.0001f )
|
||
|
{
|
||
|
fps = 1.0f / dt;
|
||
|
}
|
||
|
|
||
|
sprintf( sz, "%s (%i) at %.3f (%.2f fps) (soundcount %i)",
|
||
|
activeTool ? activeTool->GetToolName() : "None",
|
||
|
g_MDLViewer->GetCurrentFrame(),
|
||
|
(float)realtime,
|
||
|
fps,
|
||
|
models->CountActiveSources() );
|
||
|
|
||
|
lastrealtime = realtime;
|
||
|
|
||
|
int len = CChoreoWidgetDrawHelper::CalcTextWidth( "Courier New", 10, FW_NORMAL, sz );
|
||
|
|
||
|
CChoreoWidgetDrawHelper helper( this, rcTool, RGB( 32, 0, 0 ) );
|
||
|
|
||
|
rcTool.left = rcTool.right - len - 15;
|
||
|
|
||
|
helper.DrawColoredText( "Courier New", 10, FW_NORMAL, RGB( 255, 255, 200 ), rcTool, sz );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
// Input : dt -
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void mxStatusWindow::Think( float dt )
|
||
|
{
|
||
|
DrawActiveTool();
|
||
|
}
|