Add debug window (F10), displays Bullet's profiler output

pull/297/head
scrawl 10 years ago
parent fedfd7129d
commit ff0b4e0583

@ -40,7 +40,7 @@ add_openmw_dir (mwgui
merchantrepair repair soulgemdialog companionwindow bookpage journalviewmodel journalbooks
keywordsearch itemmodel containeritemmodel inventoryitemmodel sortfilteritemmodel itemview
tradeitemmodel companionitemmodel pickpocketitemmodel controllers savegamedialog
recharge mode videowidget backgroundimage itemwidget screenfader
recharge mode videowidget backgroundimage itemwidget screenfader debugwindow
)
add_openmw_dir (mwdialogue

@ -337,6 +337,8 @@ namespace MWBase
virtual void fadeScreenTo(const int percent, const float time) = 0;
/// Darken the screen by \a factor (1.0 = no darkening). Works independently from screen fading.
virtual void setScreenFactor (float factor) = 0;
virtual void toggleDebugWindow() = 0;
};
}

@ -0,0 +1,116 @@
#include "debugwindow.hpp"
#include <LinearMath/btQuickprof.h>
namespace
{
void bulletDumpRecursive(CProfileIterator* pit, int spacing, std::stringstream& os)
{
pit->First();
if (pit->Is_Done())
return;
float accumulated_time=0,parent_time = pit->Is_Root() ? CProfileManager::Get_Time_Since_Reset() : pit->Get_Current_Parent_Total_Time();
int i,j;
int frames_since_reset = CProfileManager::Get_Frame_Count_Since_Reset();
for (i=0;i<spacing;i++) os << ".";
os << "----------------------------------\n";
for (i=0;i<spacing;i++) os << ".";
std::string s = "Profiling: "+
std::string(pit->Get_Current_Parent_Name())+" (total running time: "+MyGUI::utility::toString(parent_time,3)+" ms) ---\n";
os << s;
//float totalTime = 0.f;
int numChildren = 0;
for (i = 0; !pit->Is_Done(); i++,pit->Next())
{
numChildren++;
float current_total_time = pit->Get_Current_Total_Time();
accumulated_time += current_total_time;
float fraction = parent_time > SIMD_EPSILON ? (current_total_time / parent_time) * 100 : 0.f;
for (j=0;j<spacing;j++) os << ".";
double ms = (current_total_time / (double)frames_since_reset);
s = MyGUI::utility::toString(i)+" -- "+pit->Get_Current_Name()+" ("+MyGUI::utility::toString(fraction,2)+" %) :: "+MyGUI::utility::toString(ms,3)+" ms / frame ("+MyGUI::utility::toString(pit->Get_Current_Total_Calls())+" calls)\n";
os << s;
//totalTime += current_total_time;
//recurse into children
}
if (parent_time < accumulated_time)
{
os << "what's wrong\n";
}
for (i=0;i<spacing;i++) os << ".";
double unaccounted= parent_time > SIMD_EPSILON ? ((parent_time - accumulated_time) / parent_time) * 100 : 0.f;
s = "Unaccounted: ("+MyGUI::utility::toString(unaccounted,3)+" %) :: "+MyGUI::utility::toString(parent_time - accumulated_time,3)+" ms\n";
os << s;
for (i=0;i<numChildren;i++)
{
pit->Enter_Child(i);
bulletDumpRecursive(pit, spacing+3, os);
pit->Enter_Parent();
}
}
void bulletDumpAll(std::stringstream& os)
{
CProfileIterator* profileIterator = 0;
profileIterator = CProfileManager::Get_Iterator();
bulletDumpRecursive(profileIterator, 0, os);
CProfileManager::Release_Iterator(profileIterator);
}
}
namespace MWGui
{
DebugWindow::DebugWindow()
: WindowBase("openmw_debug_window.layout")
{
getWidget(mTabControl, "TabControl");
// Ideas for other tabs:
// - Texture / compositor texture viewer
// - Log viewer
// - Material editor
// - Shader editor
MyGUI::TabItem* item = mTabControl->addItem("Physics Profiler");
mBulletProfilerEdit = item->createWidgetReal<MyGUI::EditBox>
("LogEdit", MyGUI::FloatCoord(0,0,1,1), MyGUI::Align::Stretch);
MyGUI::IntSize viewSize = MyGUI::RenderManager::getInstance().getViewSize();
mMainWidget->setSize(viewSize);
}
void DebugWindow::onFrame(float dt)
{
if (!isVisible())
return;
static float timer = 0;
timer -= dt;
if (timer > 0)
return;
timer = 1;
std::stringstream stream;
bulletDumpAll(stream);
if (mBulletProfilerEdit->isTextSelection()) // pause updating while user is trying to copy text
return;
size_t previousPos = mBulletProfilerEdit->getVScrollPosition();
mBulletProfilerEdit->setCaption(stream.str());
mBulletProfilerEdit->setVScrollPosition(std::min(previousPos, mBulletProfilerEdit->getVScrollRange()-1));
}
}

@ -0,0 +1,24 @@
#ifndef OPENMW_MWGUI_DEBUGWINDOW_H
#define OPENMW_MWGUI_DEBUGWINDOW_H
#include "windowbase.hpp"
namespace MWGui
{
class DebugWindow : public WindowBase
{
public:
DebugWindow();
void onFrame(float dt);
private:
MyGUI::TabControl* mTabControl;
MyGUI::EditBox* mBulletProfilerEdit;
};
}
#endif

@ -72,6 +72,7 @@
#include "backgroundimage.hpp"
#include "itemwidget.hpp"
#include "screenfader.hpp"
#include "debugwindow.hpp"
namespace MWGui
{
@ -120,6 +121,7 @@ namespace MWGui
, mVideoBackground(NULL)
, mVideoWidget(NULL)
, mScreenFader(NULL)
, mDebugWindow(NULL)
, mTranslationDataStorage (translationDataStorage)
, mCharGen(NULL)
, mInputBlocker(NULL)
@ -266,6 +268,7 @@ namespace MWGui
mCompanionWindow = new CompanionWindow(mDragAndDrop, mMessageBoxManager);
trackWindow(mCompanionWindow, "companion");
mScreenFader = new ScreenFader();
mDebugWindow = new DebugWindow();
mInputBlocker = MyGUI::Gui::getInstance().createWidget<MyGUI::Widget>("",0,0,w,h,MyGUI::Align::Stretch,"Overlay");
@ -357,6 +360,7 @@ namespace MWGui
delete mRecharge;
delete mCompanionWindow;
delete mScreenFader;
delete mDebugWindow;
cleanupGarbage();
@ -859,6 +863,8 @@ namespace MWGui
mCompanionWindow->onFrame();
mScreenFader->update(frameDuration);
mDebugWindow->onFrame(frameDuration);
}
void WindowManager::changeCell(MWWorld::CellStore* cell)
@ -1749,4 +1755,9 @@ namespace MWGui
SDL_free(text);
}
void WindowManager::toggleDebugWindow()
{
mDebugWindow->setVisible(!mDebugWindow->isVisible());
}
}

@ -89,6 +89,7 @@ namespace MWGui
class VideoWidget;
class WindowModal;
class ScreenFader;
class DebugWindow;
class WindowManager : public MWBase::WindowManager
{
@ -333,6 +334,8 @@ namespace MWGui
/// Darken the screen by \a factor (1.0 = no darkening). Works independently from screen fading.
virtual void setScreenFactor (float factor);
virtual void toggleDebugWindow();
private:
bool mConsoleOnlyScripts;
@ -386,6 +389,7 @@ namespace MWGui
MyGUI::ImageBox* mVideoBackground;
VideoWidget* mVideoWidget;
ScreenFader* mScreenFader;
DebugWindow* mDebugWindow;
Translation::Storage& mTranslationDataStorage;
Cursor* mSoftwareCursor;

@ -279,6 +279,9 @@ namespace MWInput
case A_ToggleHUD:
MWBase::Environment::get().getWindowManager()->toggleGui();
break;
case A_ToggleDebug:
MWBase::Environment::get().getWindowManager()->toggleDebugWindow();
break;
case A_QuickSave:
quickSave();
break;
@ -902,6 +905,7 @@ namespace MWInput
defaultKeyBindings[A_QuickKey10] = SDL_SCANCODE_0;
defaultKeyBindings[A_Screenshot] = SDL_SCANCODE_F12;
defaultKeyBindings[A_ToggleHUD] = SDL_SCANCODE_F11;
defaultKeyBindings[A_ToggleDebug] = SDL_SCANCODE_F10;
defaultKeyBindings[A_AlwaysRun] = SDL_SCANCODE_CAPSLOCK;
defaultKeyBindings[A_QuickSave] = SDL_SCANCODE_F5;
defaultKeyBindings[A_QuickLoad] = SDL_SCANCODE_F9;

@ -259,6 +259,8 @@ namespace MWInput
A_ToggleHUD,
A_ToggleDebug,
A_Last // Marker for the last item
};
};

@ -83,6 +83,8 @@ set(MYGUI_FILES
openmw_recharge_dialog.layout
openmw_screen_fader.layout
openmw_edit_note.layout
openmw_debug_window.layout
openmw_debug_window.skin.xml
DejaVuLGCSansMono.ttf
../launcher/images/openmw.png
OpenMWResourcePlugin.xml

@ -22,6 +22,7 @@
<List file="openmw_dialogue_window_skin.xml" />
<List file="openmw_scroll_skin.xml" />
<List file="openmw_settings.xml" />
<List file="openmw_debug_window.skin.xml" />
</MyGUI>
</MyGUI>

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<MyGUI type="Layout">
<Widget type="Window" skin="" position="0 0 400 400" layer="Debug" name="_Main" align="Stretch">
<Property key="Caption" value="Debug"/>
<Property key="Visible" value="false"/>
<Widget type="Widget" skin="DialogBG" position_real="0 0 1 1" name="Background" align="Stretch">
<Property key="Alpha" value="0.5"/>
</Widget>
<Widget type="TabControl" skin="TabControl" position_real="0 0 1 1" align="Stretch" name="TabControl">
<Property key="ButtonAutoWidth" value="true"/>
</Widget>
</Widget>
</MyGUI>

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<MyGUI type="Resource" version="1.1">
<Resource type="ResourceSkin" name="LogEdit" size="512 20">
<Property key="WordWrap" value="true"/>
<Property key="MultiLine" value="true"/>
<Property key="FontName" value="MonoFont"/>
<Property key="TextAlign" value="Left Top"/>
<Property key="TextColour" value="1 1 1"/>
<Property key="MaxTextLength" value="10000000"/>
<Property key="InvertSelected" value="false"/>
<Child type="TextBox" skin="MW_TextEditClient" offset="2 2 490 18" align="Stretch" name="Client"/>
<Child type="MWScrollBar" skin="MW_VScroll" offset="494 3 14 14" align="Right VStretch" name="VScroll"/>
</Resource>
</MyGUI>

@ -6,6 +6,7 @@
<Layer name="Menu" overlapped="false" peek="false"/>
<Layer name="Windows" overlapped="true" peek="true"/>
<Layer name="Console" overlapped="false" peek="true"/>
<Layer name="Debug" overlapped="true" peek="true"/>
<Layer name="Notification" overlapped="false" peek="false"/>
<Layer name="Popup" overlapped="true" peek="true"/>
<Layer name="DragAndDrop" overlapped="false" peek="false"/>

Loading…
Cancel
Save