Rendering Engine 0.2.9
Modular Graphics Rendering Engine | v0.2.9
stats_overlay.cpp
Go to the documentation of this file.
1#include "stats_overlay.hpp"
2#include "spawn_drawables.hpp"
5
6#include "rectangle_2d.hpp"
7#include "text_block_2d.hpp"
8#include "utility.hpp"
9#include "scene.hpp"
10#include "i_application.hpp"
11
12#include <cstdio>
13
14namespace rendering_engine
15{
17 :
18 Actor2D(scene),
19 mFPSLabel(nullptr),
20 mFPSValue(nullptr),
21 mFrameLabel(nullptr),
22 mFrameValue(nullptr),
23 mUpdateLabel(nullptr),
24 mUpdateValue(nullptr),
25 mDrawLabel(nullptr),
26 mDrawValue(nullptr)
27{
28 bUseSmoothedFPS = Utility::ReadConfigFile().useSmoothedFPS;
29}
30
32{
34
35 bUpdateOnTick = true;
36
38 tbProp.fontName = "RobotoMono-Medium";
39
40 const float vertDelta = 25.0f;
41 const float width = 140.0f;
42 const float pad = 5.0f;
43 const float height = vertDelta * 4;
44
45 Rectangle2D::Properties rectangleProp;
46 rectangleProp.color = mBgColor;
47 rectangleProp.size = { width, height };
48 mBackGround = CreateSubobject<Rectangle2D>(rectangleProp);
49 mBackGround->GetTransform().AttachTo(&mRootComponent);
50
51 const float middleX = width / 2.0f;
52 const float middleY = height / 2.0f;
53 const float column_0 = -middleX + pad;
54 const float column_1 = column_0 + middleX + pad;
55
56 const float row_0 = -middleY + tbProp.fontSize + pad;
57 const float row_1 = row_0 + vertDelta;
58 const float row_2 = row_1 + vertDelta;
59 const float row_3 = row_2 + vertDelta;
60
61 mFPSLabel = CreateSubobject<TextBlock2D>(tbProp);
63 mFPSLabel->SetText("FPS:");
64 mFPSLabel->SetPosition(glm::vec2(column_0, row_0));
65
66 mFPSValue = CreateSubobject<TextBlock2D>(tbProp);
68 mFPSValue->SetPosition(glm::vec2(column_1, row_0));
69
70 mFrameLabel = CreateSubobject<TextBlock2D>(tbProp);
71 mFrameLabel->GetTransform().AttachTo(&mRootComponent);
72 mFrameLabel->SetText("Frame:");
73 mFrameLabel->SetPosition(glm::vec2(column_0, row_1));
74
75 mFrameValue = CreateSubobject<TextBlock2D>(tbProp);
76 mFrameValue->GetTransform().AttachTo(&mRootComponent);
77 mFrameValue->SetPosition(glm::vec2(column_1, row_1));
78
79 mUpdateLabel = CreateSubobject<TextBlock2D>(tbProp);
80 mUpdateLabel->GetTransform().AttachTo(&mRootComponent);
81 mUpdateLabel->SetText("Update:");
82 mUpdateLabel->SetPosition(glm::vec2(column_0, row_2));
83
84 mUpdateValue = CreateSubobject<TextBlock2D>(tbProp);
85 mUpdateValue->GetTransform().AttachTo(&mRootComponent);
86 mUpdateValue->SetPosition(glm::vec2(column_1, row_2));
87
88 mDrawLabel = CreateSubobject<TextBlock2D>(tbProp);
89 mDrawLabel->GetTransform().AttachTo(&mRootComponent);
90 mDrawLabel->SetText("Draw:");
91 mDrawLabel->SetPosition(glm::vec2(column_0, row_3));
92
93 mDrawValue = CreateSubobject<TextBlock2D>(tbProp);
94 mDrawValue->GetTransform().AttachTo(&mRootComponent);
95 mDrawValue->SetPosition(glm::vec2(column_1, row_3));
96}
97
98void StatsOverlay::Update(float deltaTime)
99{
100 Actor2D::Update(deltaTime);
101
102 mTimeAccumulator += deltaTime;
103 if (mTimeAccumulator < mUpdateInterval)
104 return;
105
106 mTimeAccumulator = 0.0f;
107
108 const auto frameMetrics = GetScene().GetSceneManager().GetApplication()->GetFrameMetrics();
109
110 float fps = 0.0f;
111 if (bUseSmoothedFPS)
112 {
113 fps = frameMetrics.fpsSmoothed;
114 }
115 else
116 {
117 fps = frameMetrics.fpsRaw;
118 }
119
120 char bufferFPS[16];
121 std::snprintf(bufferFPS, sizeof(bufferFPS), "%.2f", fps);
122 mFPSValue->SetText(bufferFPS);
123
124 char bufferFrame[16];
125 std::snprintf(bufferFrame, sizeof(bufferFrame), "%.2f", frameMetrics.frameDurationMs);
126 mFrameValue->SetText(bufferFrame);
127
128 char bufferUpdate[16];
129 std::snprintf(bufferUpdate, sizeof(bufferUpdate), "%.2f", frameMetrics.updateTimeMs);
130 mUpdateValue->SetText(bufferUpdate);
131
132 char bufferDraw[16];
133 std::snprintf(bufferDraw, sizeof(bufferDraw), "%.2f", frameMetrics.drawTimeMs);
134 mDrawValue->SetText(bufferDraw);
135}
136
137} // namespace rendering_engine
138
Base class representing a 2D entity within a Scene.
Definition: actor_2d.hpp:46
SceneComponent2D mRootComponent
Definition: actor_2d.hpp:207
virtual void Update(float deltaTime)
Updates actor logic and root transform state.
Definition: actor_2d.cpp:64
virtual void Initialize()
Initializes the actor after creation.
Definition: actor_2d.cpp:20
Scene & GetScene()
Returns the owning Scene.
Definition: actor_2d.cpp:108
SceneComponent2D & GetTransform()
Access to the underlying SceneComponent2D (transform).
Definition: drawable_2d.cpp:55
void SetPosition(const glm::vec2 &position)
Sets the quad position in 2D space.
Definition: drawable_2d.cpp:25
virtual FrameMetrics GetFrameMetrics() const =0
Returns performance metrics of the last processed frame.
void AttachTo(SceneComponent2D *parent)
Attaches this scene component to a parent scene component.
IApplication * GetApplication()
Returns the application associated with this SceneManager.
Base class representing a renderable scene.
Definition: scene.hpp:44
SceneManager & GetSceneManager()
Gets a reference to the SceneManager that owns this scene.
Definition: scene.cpp:129
StatsOverlay(Scene &scene)
Constructs a StatsOverlay actor.
void Initialize() override
Creates and positions overlay visual elements.
void Update(float deltaTime) override
Updates displayed statistics each frame.
virtual void SetText(std::string text)
Sets the displayed text.
static AppConfig ReadConfigFile()
Reads application settings from the JSON config file.
Definition: utility.cpp:34
Scene::Spawn<T> specializations for built-in drawable types.
bool useSmoothedFPS
Enable FPS smoothing and frame pacing behavior.
Definition: utility.hpp:43
std::string fontName
Font family name.