146 lines
4.4 KiB
C++
146 lines
4.4 KiB
C++
#include "Debug_Actor.h"
|
|
#include "EngineCore/Game.h"
|
|
#include <string>
|
|
|
|
Debug_Actor::Debug_Actor()
|
|
{
|
|
m_debugFont = TTF_OpenFont("Fonts/GasinamuNew.ttf", 16);
|
|
if (m_debugFont == nullptr)
|
|
{
|
|
|
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Failed to load debug font: %s", TTF_GetError());
|
|
}
|
|
|
|
FPS_Text = new Text("Current FPS:", m_debugFont, SDL_Color{255, 255, 255, 255});
|
|
DT_Text = new Text("DeltaTime :", m_debugFont, SDL_Color{255, 255, 255, 255});
|
|
if (FPS_Text != nullptr)
|
|
{
|
|
SDL_Point Pos{26, 26};
|
|
FPS_Text->SetPos(Pos);
|
|
this->AddComponent(FPS_Text);
|
|
}
|
|
if (DT_Text != nullptr)
|
|
{
|
|
SDL_Point Pos{26, 46};
|
|
DT_Text->SetPos(Pos);
|
|
this->AddComponent(DT_Text);
|
|
}
|
|
}
|
|
|
|
Debug_Actor::~Debug_Actor()
|
|
{
|
|
|
|
if (m_debugFont != nullptr)
|
|
{
|
|
TTF_CloseFont(m_debugFont);
|
|
m_debugFont = nullptr;
|
|
}
|
|
}
|
|
|
|
void Debug_Actor::Update(float deltaTime)
|
|
{
|
|
Actor::Update(deltaTime);
|
|
|
|
if (FPS_Text != nullptr)
|
|
{
|
|
std::string fpsText = "Current FPS: " + std::to_string(FPS);
|
|
FPS_Text->SetText(fpsText);
|
|
std::string dtText = "DeltaTime: " + std::to_string((int)(deltaTime * 1000));
|
|
DT_Text->SetText(dtText);
|
|
}
|
|
}
|
|
|
|
void Debug_Actor::Render(float deltaTime)
|
|
{
|
|
if (FPS_Text != nullptr)
|
|
{
|
|
SDL_Renderer *renderer = Game::GetInstance().GetRenderer();
|
|
if (renderer != nullptr)
|
|
{
|
|
|
|
SDL_Point textPos = FPS_Text->Pos;
|
|
SDL_Point textSize = FPS_Text->Size;
|
|
|
|
int bgX = textPos.x - padding;
|
|
int bgY = textPos.y - padding;
|
|
int bgWidth = textSize.x + padding * 2;
|
|
int bgHeight = textSize.y + padding * 2 * 4;
|
|
|
|
DrawRoundedRect(renderer, bgX, bgY, bgWidth, bgHeight, cornerRadius, bgColor);
|
|
}
|
|
}
|
|
|
|
Actor::Render(deltaTime);
|
|
}
|
|
|
|
void Debug_Actor::DrawRoundedRect(SDL_Renderer *renderer, int x, int y, int w, int h, int radius, SDL_Color color)
|
|
{
|
|
if (renderer == nullptr)
|
|
return;
|
|
|
|
SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, color.a);
|
|
|
|
SDL_RenderDrawLine(renderer, x + radius, y, x + w - radius, y);
|
|
SDL_RenderDrawLine(renderer, x + radius, y + h, x + w - radius, y + h);
|
|
SDL_RenderDrawLine(renderer, x, y + radius, x, y + h - radius);
|
|
SDL_RenderDrawLine(renderer, x + w, y + radius, x + w, y + h - radius);
|
|
|
|
const int segments = 16;
|
|
for (int i = 0; i < segments; i++)
|
|
{
|
|
|
|
float t1 = static_cast<float>(i) / segments;
|
|
float t2 = static_cast<float>(i + 1) / segments;
|
|
|
|
float angle1 = M_PI * (1.0f - t1);
|
|
float angle2 = M_PI * (1.0f - t2);
|
|
SDL_RenderDrawLineF(
|
|
renderer,
|
|
x + radius + cos(angle1) * radius, y + radius + sin(angle1) * radius,
|
|
x + radius + cos(angle2) * radius, y + radius + sin(angle2) * radius);
|
|
|
|
angle1 = 2 * M_PI - t1 * M_PI_2;
|
|
angle2 = 2 * M_PI - t2 * M_PI_2;
|
|
SDL_RenderDrawLineF(
|
|
renderer,
|
|
x + w - radius + cos(angle1) * radius, y + radius + sin(angle1) * radius,
|
|
x + w - radius + cos(angle2) * radius, y + radius + sin(angle2) * radius);
|
|
|
|
angle1 = t1 * M_PI_2;
|
|
angle2 = t2 * M_PI_2;
|
|
SDL_RenderDrawLineF(
|
|
renderer,
|
|
x + w - radius + cos(angle1) * radius, y + h - radius + sin(angle1) * radius,
|
|
x + w - radius + cos(angle2) * radius, y + h - radius + sin(angle2) * radius);
|
|
|
|
angle1 = M_PI_2 + t1 * M_PI_2;
|
|
angle2 = M_PI_2 + t2 * M_PI_2;
|
|
SDL_RenderDrawLineF(
|
|
renderer,
|
|
x + radius + cos(angle1) * radius, y + h - radius + sin(angle1) * radius,
|
|
x + radius + cos(angle2) * radius, y + h - radius + sin(angle2) * radius);
|
|
}
|
|
|
|
for (int dy = 0; dy < h; dy++)
|
|
{
|
|
int leftIndent = 0;
|
|
int rightIndent = 0;
|
|
|
|
if (dy < radius)
|
|
{
|
|
float ratio = 1.0f - static_cast<float>(dy) / radius;
|
|
leftIndent = rightIndent = static_cast<int>(radius * (1.0f - sqrt(1.0f - ratio * ratio)));
|
|
}
|
|
|
|
else if (dy > h - radius)
|
|
{
|
|
float ratio = static_cast<float>(dy - (h - radius)) / radius;
|
|
leftIndent = rightIndent = static_cast<int>(radius * (1.0f - sqrt(1.0f - ratio * ratio)));
|
|
}
|
|
|
|
SDL_RenderDrawLine(
|
|
renderer,
|
|
x + leftIndent, y + dy,
|
|
x + w - rightIndent, y + dy);
|
|
}
|
|
} |