112 lines
3.5 KiB
C++
112 lines
3.5 KiB
C++
/* -----------------------------------------------------------------------------
|
|
GSFramework
|
|
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
|
|
----------------------------------------------------------------------------- */
|
|
|
|
|
|
#include "scene3d/scene.h"
|
|
#include "physic/physic_world.h"
|
|
#include "core/renderer.h"
|
|
|
|
using namespace GS;
|
|
using namespace GS::S3D;
|
|
|
|
|
|
namespace GS {
|
|
|
|
//
|
|
class ProfilerRenderer
|
|
{
|
|
Renderer &render;
|
|
RasterFont **font;
|
|
|
|
float &x, &y;
|
|
|
|
Renderer::WriterConfig config;
|
|
|
|
Color title_color;
|
|
|
|
static const int indent_width = 16;
|
|
static const int col_a_x = 180, col_b_x = 256;
|
|
|
|
void DisplaySystem(const char *label, const Benchmark &bench)
|
|
{
|
|
float x_h = x;
|
|
render.Write(*font[0], label, x_h, y, config, 1, &title_color);
|
|
|
|
float x_a = x + col_a_x;
|
|
render.Write(*font[0], String::Format("%0.02fms", bench.GetMs()), x_a, y, config, 1, &title_color);
|
|
float x_b = x + col_b_x;
|
|
render.Write(*font[0], bench.GetMs() ? String::Format("%.01ffps", 1000.f / bench.GetMs()) : "-", x_b, y, config, 1, &title_color);
|
|
|
|
render.Write(*font[0], "\n", x, y, config, 1, &title_color);
|
|
}
|
|
void DisplaySystem(const char *label, const Benchmark &bench, const Benchmark &parent)
|
|
{
|
|
float x_h = x;
|
|
render.Write(*font[0], label, x_h, y, config, 1, &title_color);
|
|
|
|
float x_a = x + col_a_x;
|
|
render.Write(*font[0], String::Format("%0.02fms", bench.GetMs()), x_a, y, config, 1, &title_color);
|
|
float x_b = x + col_b_x;
|
|
render.Write(*font[0], String::Format("%d%%", parent.GetMs() ? int(bench.GetMs() * 100.f / parent.GetMs()) : 0), x_b, y, config, 1, &title_color);
|
|
|
|
render.Write(*font[0], "\n", x, y, config, 1, &title_color);
|
|
}
|
|
void RenderSystem(const Profiler::System *sys, const Profiler::System *parent, int indent_level)
|
|
{
|
|
float x_s = x;
|
|
x += indent_level * indent_width;
|
|
|
|
if (parent)
|
|
DisplaySystem(sys->label, sys->profile, parent->profile);
|
|
else DisplaySystem(sys->label, sys->profile);
|
|
|
|
x = x_s;
|
|
|
|
ListForeachPtr(Profiler::System *, sub, sys->sub_systems)
|
|
RenderSystem(sub, sys, indent_level + 1);
|
|
}
|
|
|
|
public:
|
|
|
|
void DisplayHeader(const char *header)
|
|
{
|
|
render.Write(*font[1], String(header) << "\n\n", x, y, config, 1, &title_color);
|
|
}
|
|
|
|
void StartRender()
|
|
{
|
|
render.SetWorldMatrix(Matrix4::IdentityMatrix(), &Matrix4::IdentityMatrix());
|
|
render.SetViewMatrix(Matrix4::IdentityMatrix(), &Matrix4::IdentityMatrix());
|
|
render.SetProjectionMatrix(Matrix4::IdentityMatrix());
|
|
}
|
|
void Render(const Profiler &profiler)
|
|
{
|
|
ListForeachPtr(Profiler::System *, sys, profiler.root_systems)
|
|
RenderSystem(sys, NULL, 0);
|
|
}
|
|
|
|
ProfilerRenderer(Renderer &r, RasterFont *f[2], float &_x, float &_y) : render(r), font(f), x(_x), y(_y), config(false), title_color(1, 1, 1) {}
|
|
};
|
|
|
|
} // GS
|
|
|
|
//------------------------------------------------------------------------------
|
|
void SceneProfiler::ResetProfiles()
|
|
{
|
|
Profiler::ResetProfiles();
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
void Scene::DrawProfilerText(Renderer &render, RasterFont *font[2], float &x, float &y)
|
|
{
|
|
ProfilerRenderer prof_render(render, font, x, y);
|
|
|
|
prof_render.StartRender();
|
|
prof_render.DisplayHeader(String::Format("Scene: %d item, %d active (%d%%)", item_list.GetCount(), active_list.GetCount(), item_list.GetCount() ? (active_list.GetCount() * 100) / item_list.GetCount() : 100));
|
|
prof_render.Render(profiler);
|
|
}
|
|
//------------------------------------------------------------------------------
|