2021-08-03 15:08:43 +01:00
|
|
|
#include "framework.h"
|
2024-06-27 21:10:19 +10:00
|
|
|
#include "Game/Debug/Debug.h"
|
2021-12-24 03:32:19 +03:00
|
|
|
|
2024-07-16 17:37:01 +10:00
|
|
|
#include <chrono>
|
2021-08-17 14:19:53 +01:00
|
|
|
#include <spdlog.h>
|
|
|
|
#include <spdlog/sinks/basic_file_sink.h>
|
2022-10-24 14:15:42 +11:00
|
|
|
#include <spdlog/sinks/stdout_color_sinks.h>
|
2024-06-27 21:10:19 +10:00
|
|
|
#include <stdarg.h>
|
|
|
|
|
|
|
|
#include "Renderer/Renderer.h"
|
|
|
|
|
|
|
|
using TEN::Renderer::g_Renderer;
|
2021-08-17 14:19:53 +01:00
|
|
|
|
2024-06-19 15:29:46 +10:00
|
|
|
namespace TEN::Debug
|
2021-08-17 14:19:53 +01:00
|
|
|
{
|
2024-07-16 17:37:01 +10:00
|
|
|
static auto StartTime = std::chrono::high_resolution_clock::time_point{};
|
|
|
|
|
2024-06-19 15:29:46 +10:00
|
|
|
void InitTENLog(const std::string& logDirContainingDir)
|
|
|
|
{
|
|
|
|
// "true" means create new log file each time game is run.
|
|
|
|
auto logPath = logDirContainingDir + "Logs/TENLog.txt";
|
|
|
|
auto fileSink = std::make_shared<spdlog::sinks::basic_file_sink_mt>(logPath, true);
|
2021-08-03 15:08:43 +01:00
|
|
|
|
2024-06-19 15:29:46 +10:00
|
|
|
auto logger = std::shared_ptr<spdlog::logger>();
|
2022-06-24 17:07:58 +03:00
|
|
|
|
2024-06-19 15:29:46 +10:00
|
|
|
// Set file and console log targets.
|
|
|
|
auto consoleSink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
|
|
|
|
logger = std::make_shared<spdlog::logger>(std::string("multi_sink"), spdlog::sinks_init_list{ fileSink, consoleSink });
|
2022-06-24 17:07:58 +03:00
|
|
|
|
2024-06-19 15:29:46 +10:00
|
|
|
spdlog::initialize_logger(logger);
|
|
|
|
logger->set_level(spdlog::level::info);
|
|
|
|
logger->flush_on(spdlog::level::info);
|
|
|
|
logger->set_pattern("[%Y-%b-%d %T] [%^%l%$] %v");
|
2021-08-03 15:08:43 +01:00
|
|
|
}
|
|
|
|
|
2024-06-19 15:29:46 +10:00
|
|
|
void ShutdownTENLog()
|
2021-08-03 15:08:43 +01:00
|
|
|
{
|
2024-06-19 15:29:46 +10:00
|
|
|
spdlog::shutdown();
|
2021-08-03 15:08:43 +01:00
|
|
|
}
|
2022-02-14 17:05:52 +11:00
|
|
|
|
2024-06-27 21:10:19 +10:00
|
|
|
void TENLog(const std::string_view& msg, LogLevel level, LogConfig config, bool allowSpam)
|
2024-06-19 15:29:46 +10:00
|
|
|
{
|
|
|
|
static auto prevString = std::string();
|
2024-06-27 21:10:19 +10:00
|
|
|
if (prevString == msg && !allowSpam)
|
2024-06-19 15:29:46 +10:00
|
|
|
return;
|
2021-08-17 14:19:53 +01:00
|
|
|
|
2024-06-19 15:29:46 +10:00
|
|
|
if constexpr (!DebugBuild)
|
|
|
|
{
|
|
|
|
if (config == LogConfig::Debug)
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
auto logger = spdlog::get("multi_sink");
|
|
|
|
switch (level)
|
|
|
|
{
|
|
|
|
case LogLevel::Error:
|
2024-06-27 21:10:19 +10:00
|
|
|
logger->error(msg);
|
2024-06-19 15:29:46 +10:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LogLevel::Warning:
|
2024-06-27 21:10:19 +10:00
|
|
|
logger->warn(msg);
|
2024-06-19 15:29:46 +10:00
|
|
|
break;
|
|
|
|
|
|
|
|
case LogLevel::Info:
|
2024-06-27 21:10:19 +10:00
|
|
|
logger->info(msg);
|
2024-06-19 15:29:46 +10:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
logger->flush();
|
|
|
|
|
2024-06-27 21:10:19 +10:00
|
|
|
prevString = std::string(msg);
|
|
|
|
}
|
|
|
|
|
2024-07-16 17:37:01 +10:00
|
|
|
void StartDebugTimer()
|
|
|
|
{
|
|
|
|
StartTime = std::chrono::high_resolution_clock::now();
|
|
|
|
}
|
|
|
|
|
|
|
|
void EndDebugTimer()
|
|
|
|
{
|
|
|
|
auto endTime = std::chrono::high_resolution_clock::now();
|
|
|
|
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(endTime - StartTime);
|
|
|
|
|
|
|
|
PrintDebugMessage("Execution (microseconds): %d", duration);
|
|
|
|
}
|
|
|
|
|
2024-06-27 21:10:19 +10:00
|
|
|
void PrintDebugMessage(LPCSTR msg, ...)
|
|
|
|
{
|
|
|
|
auto args = va_list{};
|
|
|
|
va_start(args, msg);
|
|
|
|
g_Renderer.PrintDebugMessage(msg, args);
|
|
|
|
va_end(args);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DrawDebug2DLine(const Vector2& origin, const Vector2& target, const Color& color, RendererDebugPage page)
|
|
|
|
{
|
|
|
|
g_Renderer.AddLine2D(origin, target, color, page);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DrawDebugLine(const Vector3& origin, const Vector3& target, const Color& color, RendererDebugPage page)
|
|
|
|
{
|
|
|
|
g_Renderer.AddDebugLine(origin, target, color, page);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DrawDebugTriangle(const Vector3& vertex0, const Vector3& vertex1, const Vector3& vertex2, const Color& color, RendererDebugPage page)
|
|
|
|
{
|
|
|
|
g_Renderer.AddDebugTriangle(vertex0, vertex1, vertex2, color, page);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DrawDebugTarget(const Vector3& center, const Quaternion& orient, float radius, const Color& color, RendererDebugPage page)
|
|
|
|
{
|
|
|
|
g_Renderer.AddDebugTarget(center, orient, radius, color, page);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DrawDebugBox(const std::array<Vector3, BOX_VERTEX_COUNT>& corners, const Color& color, RendererDebugPage page, bool isWireframe)
|
|
|
|
{
|
|
|
|
g_Renderer.AddDebugBox(corners, color, page, isWireframe);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DrawDebugBox(const Vector3& min, const Vector3& max, const Color& color, RendererDebugPage page, bool isWireframe)
|
|
|
|
{
|
|
|
|
g_Renderer.AddDebugBox(min, max, color, page, isWireframe);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DrawDebugBox(const BoundingOrientedBox& box, const Color& color, RendererDebugPage page, bool isWireframe)
|
|
|
|
{
|
|
|
|
g_Renderer.AddDebugBox(box, color, page, isWireframe);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DrawDebugBox(const BoundingBox& box, const Color& color, RendererDebugPage page, bool isWireframe)
|
|
|
|
{
|
|
|
|
g_Renderer.AddDebugBox(box, color, page, isWireframe);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DrawDebugCone(const Vector3& center, const Quaternion& orient, float radius, float length, const Vector4& color, RendererDebugPage page, bool isWireframe)
|
|
|
|
{
|
|
|
|
g_Renderer.AddDebugCone(center, orient, radius, length, color, page, isWireframe);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DrawDebugCylinder(const Vector3& center, const Quaternion& orient, float radius, float length, const Color& color, RendererDebugPage page, bool isWireframe)
|
|
|
|
{
|
|
|
|
g_Renderer.AddDebugCylinder(center, orient, radius, length, color, page, isWireframe);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DrawDebugSphere(const Vector3& center, float radius, const Color& color, RendererDebugPage page, bool isWireframe)
|
|
|
|
{
|
|
|
|
g_Renderer.AddDebugSphere(center, radius, color, page, isWireframe);
|
|
|
|
}
|
|
|
|
|
|
|
|
void DrawDebugSphere(const BoundingSphere& sphere, const Color& color, RendererDebugPage page, bool isWireframe)
|
|
|
|
{
|
|
|
|
g_Renderer.AddDebugSphere(sphere, color, page, isWireframe);
|
2024-06-19 15:29:46 +10:00
|
|
|
}
|
2021-08-03 15:08:43 +01:00
|
|
|
}
|