mirror of
https://github.com/OpenMW/openmw.git
synced 2025-01-19 20:23:54 +00:00
Add debug window (F10), displays Bullet's profiler output
This commit is contained in:
parent
fedfd7129d
commit
ff0b4e0583
13 changed files with 201 additions and 1 deletions
|
@ -40,7 +40,7 @@ add_openmw_dir (mwgui
|
||||||
merchantrepair repair soulgemdialog companionwindow bookpage journalviewmodel journalbooks
|
merchantrepair repair soulgemdialog companionwindow bookpage journalviewmodel journalbooks
|
||||||
keywordsearch itemmodel containeritemmodel inventoryitemmodel sortfilteritemmodel itemview
|
keywordsearch itemmodel containeritemmodel inventoryitemmodel sortfilteritemmodel itemview
|
||||||
tradeitemmodel companionitemmodel pickpocketitemmodel controllers savegamedialog
|
tradeitemmodel companionitemmodel pickpocketitemmodel controllers savegamedialog
|
||||||
recharge mode videowidget backgroundimage itemwidget screenfader
|
recharge mode videowidget backgroundimage itemwidget screenfader debugwindow
|
||||||
)
|
)
|
||||||
|
|
||||||
add_openmw_dir (mwdialogue
|
add_openmw_dir (mwdialogue
|
||||||
|
|
|
@ -337,6 +337,8 @@ namespace MWBase
|
||||||
virtual void fadeScreenTo(const int percent, const float time) = 0;
|
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.
|
/// Darken the screen by \a factor (1.0 = no darkening). Works independently from screen fading.
|
||||||
virtual void setScreenFactor (float factor) = 0;
|
virtual void setScreenFactor (float factor) = 0;
|
||||||
|
|
||||||
|
virtual void toggleDebugWindow() = 0;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
116
apps/openmw/mwgui/debugwindow.cpp
Normal file
116
apps/openmw/mwgui/debugwindow.cpp
Normal file
|
@ -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));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
24
apps/openmw/mwgui/debugwindow.hpp
Normal file
24
apps/openmw/mwgui/debugwindow.hpp
Normal file
|
@ -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 "backgroundimage.hpp"
|
||||||
#include "itemwidget.hpp"
|
#include "itemwidget.hpp"
|
||||||
#include "screenfader.hpp"
|
#include "screenfader.hpp"
|
||||||
|
#include "debugwindow.hpp"
|
||||||
|
|
||||||
namespace MWGui
|
namespace MWGui
|
||||||
{
|
{
|
||||||
|
@ -120,6 +121,7 @@ namespace MWGui
|
||||||
, mVideoBackground(NULL)
|
, mVideoBackground(NULL)
|
||||||
, mVideoWidget(NULL)
|
, mVideoWidget(NULL)
|
||||||
, mScreenFader(NULL)
|
, mScreenFader(NULL)
|
||||||
|
, mDebugWindow(NULL)
|
||||||
, mTranslationDataStorage (translationDataStorage)
|
, mTranslationDataStorage (translationDataStorage)
|
||||||
, mCharGen(NULL)
|
, mCharGen(NULL)
|
||||||
, mInputBlocker(NULL)
|
, mInputBlocker(NULL)
|
||||||
|
@ -266,6 +268,7 @@ namespace MWGui
|
||||||
mCompanionWindow = new CompanionWindow(mDragAndDrop, mMessageBoxManager);
|
mCompanionWindow = new CompanionWindow(mDragAndDrop, mMessageBoxManager);
|
||||||
trackWindow(mCompanionWindow, "companion");
|
trackWindow(mCompanionWindow, "companion");
|
||||||
mScreenFader = new ScreenFader();
|
mScreenFader = new ScreenFader();
|
||||||
|
mDebugWindow = new DebugWindow();
|
||||||
|
|
||||||
mInputBlocker = MyGUI::Gui::getInstance().createWidget<MyGUI::Widget>("",0,0,w,h,MyGUI::Align::Stretch,"Overlay");
|
mInputBlocker = MyGUI::Gui::getInstance().createWidget<MyGUI::Widget>("",0,0,w,h,MyGUI::Align::Stretch,"Overlay");
|
||||||
|
|
||||||
|
@ -357,6 +360,7 @@ namespace MWGui
|
||||||
delete mRecharge;
|
delete mRecharge;
|
||||||
delete mCompanionWindow;
|
delete mCompanionWindow;
|
||||||
delete mScreenFader;
|
delete mScreenFader;
|
||||||
|
delete mDebugWindow;
|
||||||
|
|
||||||
cleanupGarbage();
|
cleanupGarbage();
|
||||||
|
|
||||||
|
@ -859,6 +863,8 @@ namespace MWGui
|
||||||
mCompanionWindow->onFrame();
|
mCompanionWindow->onFrame();
|
||||||
|
|
||||||
mScreenFader->update(frameDuration);
|
mScreenFader->update(frameDuration);
|
||||||
|
|
||||||
|
mDebugWindow->onFrame(frameDuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WindowManager::changeCell(MWWorld::CellStore* cell)
|
void WindowManager::changeCell(MWWorld::CellStore* cell)
|
||||||
|
@ -1749,4 +1755,9 @@ namespace MWGui
|
||||||
SDL_free(text);
|
SDL_free(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WindowManager::toggleDebugWindow()
|
||||||
|
{
|
||||||
|
mDebugWindow->setVisible(!mDebugWindow->isVisible());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,6 +89,7 @@ namespace MWGui
|
||||||
class VideoWidget;
|
class VideoWidget;
|
||||||
class WindowModal;
|
class WindowModal;
|
||||||
class ScreenFader;
|
class ScreenFader;
|
||||||
|
class DebugWindow;
|
||||||
|
|
||||||
class WindowManager : public MWBase::WindowManager
|
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.
|
/// Darken the screen by \a factor (1.0 = no darkening). Works independently from screen fading.
|
||||||
virtual void setScreenFactor (float factor);
|
virtual void setScreenFactor (float factor);
|
||||||
|
|
||||||
|
virtual void toggleDebugWindow();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool mConsoleOnlyScripts;
|
bool mConsoleOnlyScripts;
|
||||||
|
|
||||||
|
@ -386,6 +389,7 @@ namespace MWGui
|
||||||
MyGUI::ImageBox* mVideoBackground;
|
MyGUI::ImageBox* mVideoBackground;
|
||||||
VideoWidget* mVideoWidget;
|
VideoWidget* mVideoWidget;
|
||||||
ScreenFader* mScreenFader;
|
ScreenFader* mScreenFader;
|
||||||
|
DebugWindow* mDebugWindow;
|
||||||
|
|
||||||
Translation::Storage& mTranslationDataStorage;
|
Translation::Storage& mTranslationDataStorage;
|
||||||
Cursor* mSoftwareCursor;
|
Cursor* mSoftwareCursor;
|
||||||
|
|
|
@ -279,6 +279,9 @@ namespace MWInput
|
||||||
case A_ToggleHUD:
|
case A_ToggleHUD:
|
||||||
MWBase::Environment::get().getWindowManager()->toggleGui();
|
MWBase::Environment::get().getWindowManager()->toggleGui();
|
||||||
break;
|
break;
|
||||||
|
case A_ToggleDebug:
|
||||||
|
MWBase::Environment::get().getWindowManager()->toggleDebugWindow();
|
||||||
|
break;
|
||||||
case A_QuickSave:
|
case A_QuickSave:
|
||||||
quickSave();
|
quickSave();
|
||||||
break;
|
break;
|
||||||
|
@ -902,6 +905,7 @@ namespace MWInput
|
||||||
defaultKeyBindings[A_QuickKey10] = SDL_SCANCODE_0;
|
defaultKeyBindings[A_QuickKey10] = SDL_SCANCODE_0;
|
||||||
defaultKeyBindings[A_Screenshot] = SDL_SCANCODE_F12;
|
defaultKeyBindings[A_Screenshot] = SDL_SCANCODE_F12;
|
||||||
defaultKeyBindings[A_ToggleHUD] = SDL_SCANCODE_F11;
|
defaultKeyBindings[A_ToggleHUD] = SDL_SCANCODE_F11;
|
||||||
|
defaultKeyBindings[A_ToggleDebug] = SDL_SCANCODE_F10;
|
||||||
defaultKeyBindings[A_AlwaysRun] = SDL_SCANCODE_CAPSLOCK;
|
defaultKeyBindings[A_AlwaysRun] = SDL_SCANCODE_CAPSLOCK;
|
||||||
defaultKeyBindings[A_QuickSave] = SDL_SCANCODE_F5;
|
defaultKeyBindings[A_QuickSave] = SDL_SCANCODE_F5;
|
||||||
defaultKeyBindings[A_QuickLoad] = SDL_SCANCODE_F9;
|
defaultKeyBindings[A_QuickLoad] = SDL_SCANCODE_F9;
|
||||||
|
|
|
@ -259,6 +259,8 @@ namespace MWInput
|
||||||
|
|
||||||
A_ToggleHUD,
|
A_ToggleHUD,
|
||||||
|
|
||||||
|
A_ToggleDebug,
|
||||||
|
|
||||||
A_Last // Marker for the last item
|
A_Last // Marker for the last item
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -83,6 +83,8 @@ set(MYGUI_FILES
|
||||||
openmw_recharge_dialog.layout
|
openmw_recharge_dialog.layout
|
||||||
openmw_screen_fader.layout
|
openmw_screen_fader.layout
|
||||||
openmw_edit_note.layout
|
openmw_edit_note.layout
|
||||||
|
openmw_debug_window.layout
|
||||||
|
openmw_debug_window.skin.xml
|
||||||
DejaVuLGCSansMono.ttf
|
DejaVuLGCSansMono.ttf
|
||||||
../launcher/images/openmw.png
|
../launcher/images/openmw.png
|
||||||
OpenMWResourcePlugin.xml
|
OpenMWResourcePlugin.xml
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
<List file="openmw_dialogue_window_skin.xml" />
|
<List file="openmw_dialogue_window_skin.xml" />
|
||||||
<List file="openmw_scroll_skin.xml" />
|
<List file="openmw_scroll_skin.xml" />
|
||||||
<List file="openmw_settings.xml" />
|
<List file="openmw_settings.xml" />
|
||||||
|
<List file="openmw_debug_window.skin.xml" />
|
||||||
</MyGUI>
|
</MyGUI>
|
||||||
</MyGUI>
|
</MyGUI>
|
||||||
|
|
||||||
|
|
16
files/mygui/openmw_debug_window.layout
Normal file
16
files/mygui/openmw_debug_window.layout
Normal file
|
@ -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>
|
17
files/mygui/openmw_debug_window.skin.xml
Normal file
17
files/mygui/openmw_debug_window.skin.xml
Normal file
|
@ -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="Menu" overlapped="false" peek="false"/>
|
||||||
<Layer name="Windows" overlapped="true" peek="true"/>
|
<Layer name="Windows" overlapped="true" peek="true"/>
|
||||||
<Layer name="Console" overlapped="false" 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="Notification" overlapped="false" peek="false"/>
|
||||||
<Layer name="Popup" overlapped="true" peek="true"/>
|
<Layer name="Popup" overlapped="true" peek="true"/>
|
||||||
<Layer name="DragAndDrop" overlapped="false" peek="false"/>
|
<Layer name="DragAndDrop" overlapped="false" peek="false"/>
|
||||||
|
|
Loading…
Reference in a new issue