170 lines
5.1 KiB
C++
170 lines
5.1 KiB
C++
#include "Utility.h"
|
|
|
|
#ifndef NDEBUG
|
|
|
|
namespace Utility
|
|
{
|
|
namespace Debug
|
|
{
|
|
ImGuiLogger openGLLogger;
|
|
}
|
|
} // namespace Utility
|
|
|
|
void Utility::Debug::ImGuiLogger::Clear()
|
|
{
|
|
Buf.clear();
|
|
LineOffsets.clear();
|
|
}
|
|
|
|
void Utility::Debug::ImGuiLogger::AddLog(const char *fmt, ...) IM_FMTARGS(2)
|
|
{
|
|
int old_size = Buf.size();
|
|
va_list args;
|
|
va_start(args, fmt);
|
|
Buf.appendfv(fmt, args);
|
|
va_end(args);
|
|
for (int new_size = Buf.size(); old_size < new_size; old_size++)
|
|
if (Buf[old_size] == '\n')
|
|
LineOffsets.push_back(old_size);
|
|
ScrollToBottom = true;
|
|
}
|
|
|
|
void Utility::Debug::ImGuiLogger::Draw(const char *title, bool *p_open)
|
|
{
|
|
ImGui::SetNextWindowSize(ImVec2(500, 400), ImGuiCond_FirstUseEver);
|
|
ImGui::Begin(title, p_open);
|
|
if (ImGui::Button("Clear"))
|
|
Clear();
|
|
ImGui::SameLine();
|
|
bool copy = ImGui::Button("Copy");
|
|
ImGui::SameLine();
|
|
ImGui::Checkbox("Errors", &ShowError);
|
|
ImGui::SameLine();
|
|
ImGui::Checkbox("Deprecated Behavior", &ShowDeprecatedBehavior);
|
|
ImGui::SameLine();
|
|
ImGui::Checkbox("Undefined Behavior", &ShowUndefinedBehavior);
|
|
ImGui::SameLine();
|
|
ImGui::Checkbox("Portability", &ShowPortability);
|
|
ImGui::Checkbox("Performance", &ShowPerformance);
|
|
ImGui::SameLine();
|
|
ImGui::Checkbox("Marker", &ShowMarker);
|
|
ImGui::SameLine();
|
|
ImGui::Checkbox("Push Group", &ShowPushGroup);
|
|
ImGui::SameLine();
|
|
ImGui::Checkbox("Pop Group", &ShowPopGroup);
|
|
ImGui::SameLine();
|
|
ImGui::Checkbox("Other", &ShowOther);
|
|
|
|
Filter.Draw("Filter", -100.0f);
|
|
ImGui::Separator();
|
|
ImGui::BeginChild("scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_HorizontalScrollbar);
|
|
if (copy)
|
|
ImGui::LogToClipboard();
|
|
|
|
if (Filter.IsActive())
|
|
{
|
|
const char *buf_begin = Buf.begin();
|
|
const char *line = buf_begin;
|
|
for (int line_no = 0; line != NULL; line_no++)
|
|
{
|
|
const char *line_end = (line_no < LineOffsets.Size) ? buf_begin + LineOffsets[line_no] : NULL;
|
|
if (Filter.PassFilter(line, line_end))
|
|
ImGui::TextUnformatted(line, line_end);
|
|
line = line_end && line_end[1] ? line_end + 1 : NULL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ImGui::TextUnformatted(Buf.begin());
|
|
}
|
|
|
|
if (ScrollToBottom)
|
|
ImGui::SetScrollHere(1.0f);
|
|
ScrollToBottom = false;
|
|
ImGui::EndChild();
|
|
ImGui::End();
|
|
}
|
|
|
|
#endif //NDEBUG
|
|
|
|
void APIENTRY Utility::openglCallbackFunction(GLenum source,
|
|
GLenum type,
|
|
GLuint id,
|
|
GLenum severity,
|
|
GLsizei length,
|
|
const GLchar *message,
|
|
const void *userParam)
|
|
{
|
|
|
|
std::string _severity;
|
|
switch (severity)
|
|
{
|
|
case GL_DEBUG_SEVERITY_LOW:
|
|
_severity = "LOW";
|
|
break;
|
|
case GL_DEBUG_SEVERITY_MEDIUM:
|
|
_severity = "MEDIUM";
|
|
break;
|
|
case GL_DEBUG_SEVERITY_HIGH:
|
|
_severity = "HIGH";
|
|
break;
|
|
default:
|
|
_severity = "NOTIFICATION";
|
|
break;
|
|
}
|
|
|
|
switch (type)
|
|
{
|
|
case GL_DEBUG_TYPE_ERROR:
|
|
if (Utility::Debug::openGLLogger.ShowError)
|
|
{
|
|
Debug::openGLLogger.AddLog("ERROR: %s ID: %d SEVERITY: %s\n", message, id, _severity.c_str());
|
|
}
|
|
break;
|
|
case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
|
|
if (Utility::Debug::openGLLogger.ShowDeprecatedBehavior)
|
|
{
|
|
Debug::openGLLogger.AddLog("DEPRECATED_BEHAVIOR: %s ID: %d SEVERITY: %s\n", message, id, _severity.c_str());
|
|
}
|
|
break;
|
|
case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
|
|
if (Utility::Debug::openGLLogger.ShowUndefinedBehavior)
|
|
{
|
|
Debug::openGLLogger.AddLog("UNDEFINED_BEHAVIOR: %s ID: %d SEVERITY: %s\n", message, id, _severity.c_str());
|
|
}
|
|
break;
|
|
case GL_DEBUG_TYPE_PORTABILITY:
|
|
if (Utility::Debug::openGLLogger.ShowPortability)
|
|
{
|
|
Debug::openGLLogger.AddLog("PORTATBILITY: %s ID: %d SEVERITY: %s\n", message, id, _severity.c_str());
|
|
}
|
|
break;
|
|
case GL_DEBUG_TYPE_PERFORMANCE:
|
|
if (Utility::Debug::openGLLogger.ShowPerformance)
|
|
{
|
|
Debug::openGLLogger.AddLog("PERFORMANCE: %s ID: %d SEVERITY: %s\n", message, id, _severity.c_str());
|
|
}
|
|
break;
|
|
case GL_DEBUG_TYPE_OTHER:
|
|
if (Utility::Debug::openGLLogger.ShowOther)
|
|
{
|
|
Debug::openGLLogger.AddLog("OTHER: %s ID: %d SEVERITY: %s\n", message, id, _severity.c_str());
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
static const char *Errornames[] = {"OpenGL", "SDL", "GLEW", "Other"};
|
|
void Utility::printWarning(ERROR_TYPE type, std::string msg)
|
|
{
|
|
std::cout << "Warning[" << Errornames[type] << "]: " << msg << std::endl;
|
|
}
|
|
|
|
void Utility::printError(ERROR_TYPE type, std::string msg)
|
|
{
|
|
std::cout << "Error[" << Errornames[type] << "]: " << msg << std::endl;
|
|
}
|
|
void Utility::printInfo(ERROR_TYPE type, std::string msg)
|
|
{
|
|
std::cout << "Info[" << Errornames[type] << "]: " << msg << std::endl;
|
|
} |