2005-03-30 18:14:19 +02:00
|
|
|
#include "precompiled.h"
|
|
|
|
#include "ProfileViewer.h"
|
|
|
|
#include "Profile.h"
|
|
|
|
#include "Renderer.h"
|
|
|
|
#include "res/unifont.h"
|
|
|
|
#include "Hotkey.h"
|
|
|
|
|
2005-04-15 06:23:33 +02:00
|
|
|
bool profileVisible = false;
|
2005-03-30 18:14:19 +02:00
|
|
|
extern int g_xres, g_yres;
|
|
|
|
|
|
|
|
const CProfileNode* currentNode = NULL;
|
|
|
|
|
|
|
|
void ResetProfileViewer()
|
|
|
|
{
|
|
|
|
currentNode = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
void RenderProfileNode( CProfileNode* node, int currentNodeid )
|
|
|
|
{
|
|
|
|
glPushMatrix();
|
|
|
|
if( node->CanExpand() )
|
|
|
|
{
|
|
|
|
glPushMatrix();
|
|
|
|
glTranslatef( -15.0f, 0.0f, 0.0f );
|
|
|
|
glwprintf( L"%d", currentNodeid );
|
|
|
|
glPopMatrix();
|
|
|
|
}
|
|
|
|
|
|
|
|
glPushMatrix();
|
|
|
|
glwprintf( L"%hs", node->GetName() );
|
|
|
|
glPopMatrix();
|
|
|
|
glTranslatef( 230.0f, 0.0f, 0.0f );
|
|
|
|
glPushMatrix();
|
|
|
|
#ifdef PROFILE_AMORTIZE
|
|
|
|
glwprintf( L"%.3f", node->GetFrameCalls() );
|
|
|
|
#else
|
|
|
|
glwprintf( L"%d", node->GetFrameCalls() );
|
|
|
|
#endif
|
|
|
|
glPopMatrix();
|
|
|
|
glTranslatef( 100.0f, 0.0f, 0.0f );
|
|
|
|
glPushMatrix();
|
|
|
|
glwprintf( L"%.3f", node->GetFrameTime() * 1000.0f );
|
|
|
|
glPopMatrix();
|
|
|
|
glTranslatef( 100.0f, 0.0f, 0.0f );
|
|
|
|
glPushMatrix();
|
|
|
|
|
|
|
|
glwprintf( L"%.1f", node->GetFrameTime() * 100.0 / g_Profiler.GetRoot()->GetFrameTime() );
|
|
|
|
glPopMatrix();
|
|
|
|
glTranslatef( 100.0f, 0.0f, 0.0f );
|
|
|
|
glPushMatrix();
|
|
|
|
glwprintf( L"%.1f", node->GetFrameTime() * 100.0 / currentNode->GetFrameTime() );
|
|
|
|
glPopMatrix();
|
|
|
|
glPopMatrix();
|
|
|
|
|
|
|
|
glTranslatef( 0.0f, 20.0f, 0.0f );
|
|
|
|
}
|
|
|
|
|
|
|
|
void RenderProfile()
|
|
|
|
{
|
|
|
|
if( !profileVisible ) return;
|
|
|
|
if( !currentNode ) currentNode = g_Profiler.GetRoot();
|
|
|
|
|
|
|
|
glPushMatrix();
|
|
|
|
glColor3f(1.0f, 1.0f, 1.0f);
|
|
|
|
|
|
|
|
glTranslatef(2.0f, g_yres - 20.0f, 0.0f );
|
|
|
|
glScalef(1.0f, -1.0f, 1.0f);
|
|
|
|
|
|
|
|
glPushMatrix();
|
|
|
|
glwprintf( L"Profiling Information for: %hs (Time in node: %.3f msec/frame)", currentNode->GetName(), currentNode->GetFrameTime() * 1000.0f );
|
|
|
|
glPopMatrix();
|
|
|
|
glTranslatef( 20.0f, 20.0f, 0.0f );
|
|
|
|
glPushMatrix();
|
|
|
|
glPushMatrix();
|
|
|
|
glwprintf( L"Name" );
|
|
|
|
glPopMatrix();
|
|
|
|
glTranslatef( 230.0f, 0.0f, 0.0f );
|
|
|
|
glPushMatrix();
|
|
|
|
glwprintf( L"calls/frame" );
|
|
|
|
glPopMatrix();
|
|
|
|
glTranslatef( 100.0f, 0.0f, 0.0f );
|
|
|
|
glPushMatrix();
|
|
|
|
glwprintf( L"msec/frame" );
|
|
|
|
glPopMatrix();
|
|
|
|
glTranslatef( 100.0f, 0.0f, 0.0f );
|
|
|
|
glPushMatrix();
|
|
|
|
glwprintf( L"%%/frame" );
|
|
|
|
glPopMatrix();
|
|
|
|
glTranslatef( 100.0f, 0.0f, 0.0f );
|
|
|
|
glPushMatrix();
|
|
|
|
glwprintf( L"%%/parent" );
|
|
|
|
glPopMatrix();
|
2005-06-01 22:12:45 +02:00
|
|
|
glPopMatrix();
|
2005-03-30 18:14:19 +02:00
|
|
|
|
|
|
|
|
|
|
|
CProfileNode::const_profile_iterator it;
|
|
|
|
|
|
|
|
glTranslatef( 0.0f, 20.0f, 0.0f );
|
|
|
|
|
2005-03-30 20:32:16 +02:00
|
|
|
float unlogged = (float)currentNode->GetFrameTime();
|
2005-03-30 18:14:19 +02:00
|
|
|
|
|
|
|
int currentNodeid = 1;
|
|
|
|
|
|
|
|
for( it = currentNode->GetChildren()->begin(); it != currentNode->GetChildren()->end(); it++, currentNodeid++ )
|
|
|
|
{
|
2005-03-30 20:32:16 +02:00
|
|
|
unlogged -= (float)(*it)->GetFrameTime();
|
2005-03-30 18:14:19 +02:00
|
|
|
RenderProfileNode( *it, currentNodeid );
|
|
|
|
}
|
|
|
|
glColor3f( 1.0f, 0.5f, 0.5f );
|
|
|
|
for( it = currentNode->GetScriptChildren()->begin(); it != currentNode->GetScriptChildren()->end(); it++, currentNodeid++ )
|
|
|
|
{
|
2005-03-30 20:32:16 +02:00
|
|
|
unlogged -= (float)(*it)->GetFrameTime();
|
2005-03-30 18:14:19 +02:00
|
|
|
RenderProfileNode( *it, currentNodeid );
|
|
|
|
}
|
|
|
|
glColor3f( 1.0f, 1.0f, 1.0f );
|
|
|
|
|
|
|
|
glTranslatef( 0.0f, 20.0f, 0.0f );
|
|
|
|
glPushMatrix();
|
|
|
|
|
|
|
|
glPushMatrix();
|
|
|
|
glwprintf( L"unlogged" );
|
|
|
|
glPopMatrix();
|
|
|
|
glTranslatef( 330.0f, 0.0f, 0.0f );
|
|
|
|
glPushMatrix();
|
|
|
|
glwprintf( L"%.3f", unlogged * 1000.0f );
|
|
|
|
glPopMatrix();
|
|
|
|
glTranslatef( 100.0f, 0.0f, 0.0f );
|
|
|
|
glPushMatrix();
|
|
|
|
glwprintf( L"%.1f", ( unlogged / g_Profiler.GetRoot()->GetFrameTime() ) * 100.0f );
|
|
|
|
glPopMatrix();
|
|
|
|
glTranslatef( 100.0f, 0.0f, 0.0f );
|
|
|
|
glPushMatrix();
|
|
|
|
glwprintf( L"%.1f", ( unlogged / currentNode->GetFrameTime() ) * 100.0f );
|
|
|
|
glPopMatrix();
|
|
|
|
glPopMatrix();
|
|
|
|
|
|
|
|
if( currentNode->GetParent() )
|
|
|
|
{
|
|
|
|
glTranslatef( 0.0f, 20.0f, 0.0f );
|
|
|
|
glPushMatrix();
|
|
|
|
glPushMatrix();
|
|
|
|
glTranslatef( -15.0f, 0.0f, 0.0f );
|
|
|
|
glwprintf( L"0" );
|
|
|
|
glPopMatrix();
|
|
|
|
glwprintf( L"back to parent" );
|
|
|
|
glPopMatrix();
|
|
|
|
}
|
|
|
|
|
|
|
|
glPopMatrix();
|
|
|
|
}
|
|
|
|
|
|
|
|
int profilehandler( const SDL_Event* ev )
|
|
|
|
{
|
|
|
|
switch( ev->type )
|
|
|
|
{
|
|
|
|
case SDL_KEYDOWN:
|
|
|
|
{
|
|
|
|
if( profileVisible )
|
|
|
|
{
|
|
|
|
int k = ev->key.keysym.sym - SDLK_0;
|
|
|
|
if( k == 0 )
|
|
|
|
{
|
|
|
|
if( currentNode->GetParent() )
|
|
|
|
currentNode = currentNode->GetParent();
|
|
|
|
}
|
|
|
|
else if( ( k >= 1 ) && ( k <= 9 ) )
|
|
|
|
{
|
|
|
|
k--;
|
|
|
|
CProfileNode::const_profile_iterator it;
|
|
|
|
for( it = currentNode->GetChildren()->begin(); it != currentNode->GetChildren()->end(); it++, k-- )
|
|
|
|
if( (*it)->CanExpand() && !k )
|
|
|
|
{
|
|
|
|
currentNode = (*it);
|
|
|
|
return( EV_HANDLED );
|
|
|
|
}
|
|
|
|
for( it = currentNode->GetScriptChildren()->begin(); it != currentNode->GetScriptChildren()->end(); it++, k-- )
|
|
|
|
if( (*it)->CanExpand() && !k )
|
|
|
|
{
|
|
|
|
currentNode = (*it);
|
|
|
|
return( EV_HANDLED );
|
|
|
|
}
|
|
|
|
return( EV_HANDLED );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case SDL_HOTKEYDOWN:
|
|
|
|
if( ev->user.code == HOTKEY_PROFILE_TOGGLE )
|
|
|
|
{
|
|
|
|
profileVisible = !profileVisible;
|
|
|
|
return( EV_HANDLED );
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return( EV_PASS );
|
|
|
|
}
|