game view stats - closes #1094

This commit is contained in:
Mikulas Florek 2017-02-22 15:12:36 +01:00
parent 36a64d3a4c
commit 0ead4dd116
4 changed files with 66 additions and 107 deletions

View file

@ -52,6 +52,7 @@ GameView::GameView(StudioApp& app)
, m_time_multiplier(1.0f)
, m_paused(false)
, m_is_opengl(false)
, m_show_stats(false)
, m_texture_handle(BGFX_INVALID_HANDLE)
, m_gui_interface(nullptr)
{
@ -197,6 +198,42 @@ void GameView::setFullscreen(bool fullscreen)
}
void GameView::onStatsGUI(const ImVec2& view_pos)
{
if (!m_show_stats || !m_is_opened) return;
float toolbar_height = 24 + ImGui::GetStyle().FramePadding.y * 2;
ImVec2 v = view_pos;
v.x += ImGui::GetStyle().FramePadding.x;
v.y += ImGui::GetStyle().FramePadding.y + toolbar_height;
ImGui::SetNextWindowPos(v);
auto col = ImGui::GetStyle().Colors[ImGuiCol_WindowBg];
col.w = 0.3f;
ImGui::PushStyleColor(ImGuiCol_WindowBg, col);
if (ImGui::Begin("###stats_overlay",
nullptr,
ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_AlwaysAutoResize |
ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings |
ImGuiWindowFlags_ShowBorders))
{
const auto& stats = m_pipeline->getStats();
ImGui::LabelText("Draw calls", "%d", stats.draw_call_count);
ImGui::LabelText("Instances", "%d", stats.instance_count);
char buf[30];
Lumix::toCStringPretty(stats.triangle_count, buf, Lumix::lengthOf(buf));
ImGui::LabelText("Triangles", "%s", buf);
ImGui::LabelText("Resolution", "%dx%d", m_pipeline->getWidth(), m_pipeline->getHeight());
ImGui::LabelText("FPS", "%.2f", m_editor->getEngine().getFPS());
ImGui::LabelText("CPU time", "%.2f", m_pipeline->getCPUTime() * 1000.0f);
ImGui::LabelText("GPU time", "%.2f", m_pipeline->getGPUTime() * 1000.0f);
ImGui::LabelText("Waiting for submit", "%.2f", m_pipeline->getWaitSubmitTime() * 1000.0f);
ImGui::LabelText("Waiting for render thread", "%.2f", m_pipeline->getGPUTime() * 1000.0f);
}
ImGui::End();
ImGui::PopStyleColor();
}
void GameView::onGUI()
{
PROFILE_FUNCTION();
@ -219,8 +256,11 @@ void GameView::onGUI()
onFullscreenGUI();
return;
}
ImVec2 view_pos;
bool is_game_view_visible = false;
if (ImGui::BeginDock(window_name, &m_is_opened))
{
is_game_view_visible = true;
m_is_mouse_hovering_window = ImGui::IsMouseHoveringWindow();
auto content_min = ImGui::GetCursorScreenPos();
@ -233,6 +273,7 @@ void GameView::onGUI()
auto* fb = m_pipeline->getFramebuffer("default");
m_texture_handle = fb->getRenderbufferHandle(0);
view_pos = ImGui::GetCursorScreenPos();
if (m_is_opengl)
{
ImGui::Image(&m_texture_handle, size, ImVec2(0, 1), ImVec2(1, 0));
@ -277,6 +318,8 @@ void GameView::onGUI()
setFullscreen(true);
}
}
ImGui::SameLine();
ImGui::Checkbox("Stats", &m_show_stats);
m_pipeline->render();
}
@ -292,4 +335,5 @@ void GameView::onGUI()
}
}
ImGui::EndDock();
if(is_game_view_visible) onStatsGUI(view_pos);
}

View file

@ -5,6 +5,7 @@
#include <bgfx/bgfx.h>
struct ImVec2;
struct PlatformData;
class StudioApp;
@ -39,6 +40,7 @@ private:
void onUniverseDestroyed();
void onFullscreenGUI();
void setFullscreen(bool fullscreen);
void onStatsGUI(const ImVec2& view_pos);
private:
Lumix::Pipeline* m_pipeline;
@ -55,5 +57,6 @@ private:
bool m_paused;
bool m_is_opengl;
bool m_is_fullscreen;
bool m_show_stats;
int m_captured_mouse_x, m_captured_mouse_y;
};

View file

@ -969,7 +969,7 @@ public:
serializer.write("initial_size_to", emitter->m_initial_size.to);
serializer.write("spawn_count_from", emitter->m_spawn_count.from);
serializer.write("spawn_count_to", emitter->m_spawn_count.to);
Material* material = emitter->getMaterial();
const Material* material = emitter->getMaterial();
serializer.write("material", material ? material->getPath().c_str() : "");
}

View file

@ -689,16 +689,8 @@ struct RendererImpl LUMIX_FINAL : public Renderer
}
int getLayersCount() const override
{
return m_layers.size();
}
const char* getLayerName(int idx) const override
{
return m_layers[idx];
}
int getLayersCount() const override { return m_layers.size(); }
const char* getLayerName(int idx) const override { return m_layers[idx]; }
bool isOpenGL() const override
@ -708,34 +700,11 @@ struct RendererImpl LUMIX_FINAL : public Renderer
}
ModelManager& getModelManager() override
{
return m_model_manager;
}
MaterialManager& getMaterialManager() override
{
return m_material_manager;
}
TextureManager& getTextureManager() override
{
return m_texture_manager;
}
const bgfx::VertexDecl& getBasicVertexDecl() const override
{
return m_basic_vertex_decl;
}
const bgfx::VertexDecl& getBasic2DVertexDecl() const override
{
return m_basic_2d_vertex_decl;
}
ModelManager& getModelManager() override { return m_model_manager; }
MaterialManager& getMaterialManager() override { return m_material_manager; }
TextureManager& getTextureManager() override { return m_texture_manager; }
const bgfx::VertexDecl& getBasicVertexDecl() const override { return m_basic_vertex_decl; }
const bgfx::VertexDecl& getBasic2DVertexDecl() const override { return m_basic_2d_vertex_decl; }
void createScenes(Universe& ctx) override
@ -745,28 +714,19 @@ struct RendererImpl LUMIX_FINAL : public Renderer
}
void destroyScene(IScene* scene) override
{
RenderScene::destroyInstance(static_cast<RenderScene*>(scene));
}
void destroyScene(IScene* scene) override { RenderScene::destroyInstance(static_cast<RenderScene*>(scene)); }
const char* getName() const override { return "renderer"; }
Engine& getEngine() override { return m_engine; }
int getShaderDefinesCount() const override
{
return m_shader_defines.size();
}
const char* getShaderDefine(int define_idx) override
{
return m_shader_defines[define_idx];
}
int getShaderDefinesCount() const override { return m_shader_defines.size(); }
const char* getShaderDefine(int define_idx) override { return m_shader_defines[define_idx]; }
const char* getPassName(int idx) override { return m_passes[idx]; }
const bgfx::UniformHandle& getMaterialColorUniform() const override { return m_mat_color_uniform; }
const bgfx::UniformHandle& getRoughnessMetallicUniform() const override { return m_roughness_metallic_uniform; }
void makeScreenshot(const Path& filename) override { bgfx::saveScreenShot(filename.c_str()); }
void resize(int w, int h) override { bgfx::reset(w, h); }
int getViewCounter() const override { return m_view_counter; }
void viewCounterAdd() override { ++m_view_counter; }
Shader* getDefaultShader() override { return m_default_shader; }
u8 getShaderDefineIdx(const char* define) override
@ -785,12 +745,6 @@ struct RendererImpl LUMIX_FINAL : public Renderer
}
const char* getPassName(int idx) override
{
return m_passes[idx];
}
int getPassIdx(const char* pass) override
{
for (int i = 0; i < m_passes.size(); ++i)
@ -806,30 +760,6 @@ struct RendererImpl LUMIX_FINAL : public Renderer
}
const bgfx::UniformHandle& getMaterialColorUniform() const override
{
return m_mat_color_uniform;
}
const bgfx::UniformHandle& getRoughnessMetallicUniform() const override
{
return m_roughness_metallic_uniform;
}
void makeScreenshot(const Path& filename) override
{
bgfx::saveScreenShot(filename.c_str());
}
void resize(int w, int h) override
{
bgfx::reset(w, h);
}
void frame(bool capture) override
{
PROFILE_FUNCTION();
@ -838,24 +768,6 @@ struct RendererImpl LUMIX_FINAL : public Renderer
}
int getViewCounter() const override
{
return m_view_counter;
}
void viewCounterAdd() override
{
++m_view_counter;
}
Shader* getDefaultShader() override
{
return m_default_shader;
}
using ShaderDefine = StaticString<32>;
using Layer = StaticString<32>;