I am trying implement GLAD-GLFW-IMGUI version of renderer. I am just trying to display two Imgui windows with docking system. I am using docking branch of Imgui, GLAD(core) and glfw. Below is my code for it. I am getting a blank white window.
//HEADERS
// Emedded font
#include "ImGui/Roboto-Regular.embed"
extern bool g_ApplicationRunning;
static void glfw_error_callback(int error, const char* description)
{
fprintf(stderr, "Glfw Error %d: %s\n", error, description);
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{ glViewport(0, 0, width, height);}
void Application::Init()
{
// Setup GLFW window
if (!glfwInit())
{
std::cerr << "Could not initalize GLFW!\n";
return;
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
m_WindowHandle = glfwCreateWindow(m_Specification.Width, m_Specification.Height, m_Specification.Name.c_str(), NULL, NULL);
if (!m_WindowHandle)
{
std::cerr << "Failed to create GLFW window\n";
glfwTerminate();
return;
}
glfwMakeContextCurrent(m_WindowHandle);
glfwSetFramebufferSizeCallback(m_WindowHandle, framebuffer_size_callback);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cerr << "Failed to initialize GLAD" << std::endl;
return;
}
// Setup Dear ImGui context
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
(void)io;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // Enable Dockin
io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
// Setup Dear ImGui style
ImGui::StyleColorsDark();
ImGuiStyle& style = ImGui::GetStyle();
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
{
style.WindowRounding = 0.0f;
style.Colors[ImGuiCol_WindowBg].w = 1.0f;
}
// Load default font
ImFontConfig fontConfig;
fontConfig.FontDataOwnedByAtlas = false;
ImFont* robotoFont = io.Fonts->AddFontFromMemoryTTF((void*)g_RobotoRegular, sizeof(g_RobotoRegular), 20.0f, &fontConfig);
io.FontDefault = robotoFont;
// Setup ImGui binding
ImGui_ImplGlfw_InitForOpenGL(m_WindowHandle, true);
ImGui_ImplOpenGL3_Init("#version 410");
}
void Application::Shutdown()
{
for (auto& layer : m_LayerStack)
layer->OnDetach();
m_LayerStack.clear();
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
glfwDestroyWindow(m_WindowHandle);
glfwTerminate();
g_ApplicationRunning = false;
}
void Application::Run()
{
m_Running = true;
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
ImGuiIO& io = ImGui::GetIO();
// Main loop
while (!glfwWindowShouldClose(m_WindowHandle) && m_Running)
{
glfwPollEvents();
for (auto& layer : m_LayerStack)
layer->OnUpdate(m_TimeStep);
// Start the Dear ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
{
static ImGuiDockNodeFlags dockspace_flags = ImGuiDockNodeFlags_None;
ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDocking;
if (m_MenubarCallback)
window_flags |= ImGuiWindowFlags_MenuBar;
const ImGuiViewport* viewport = ImGui::GetMainViewport();
ImGui::SetNextWindowPos(viewport->WorkPos);
ImGui::SetNextWindowSize(viewport->WorkSize);
ImGui::SetNextWindowViewport(viewport->ID);
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
window_flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove;
window_flags |= ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoNavFocus;
if (dockspace_flags & ImGuiDockNodeFlags_PassthruCentralNode)
window_flags |= ImGuiWindowFlags_NoBackground;
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
ImGui::Begin("DockSpace Demo", nullptr, window_flags);
ImGui::PopStyleVar();
ImGui::PopStyleVar(2);
// Submit the DockSpace
ImGuiIO& io = ImGui::GetIO();
if (io.ConfigFlags & ImGuiConfigFlags_DockingEnable)
{
ImGuiID dockspace_id = ImGui::GetID("GladAppDockspace");
ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f), dockspace_flags);
}
if (m_MenubarCallback)
{
if (ImGui::BeginMenuBar())
{
m_MenubarCallback();
ImGui::EndMenuBar();
}
}
for (auto& layer : m_LayerStack)
layer->OnUIRender();
ImGui::End();
}
// Rendering
ImGui::Render();
ImDrawData* main_draw_data = ImGui::GetDrawData();
const bool main_is_minimized = (main_draw_data->DisplaySize.x <= 0.0f || main_draw_data->DisplaySize.y <= 0.0f);
if (!main_is_minimized)
ImGui_ImplOpenGL3_RenderDrawData(main_draw_data);
// Update and Render additional Platform Windows
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
{
GLFWwindow* backup_current_context = glfwGetCurrentContext();
ImGui::UpdatePlatformWindows();
ImGui::RenderPlatformWindowsDefault();
glfwMakeContextCurrent(backup_current_context);
}
float time = GetTime();
m_FrameTime = time - m_LastFrameTime;
m_TimeStep = glm::min<float>(m_FrameTime, 0.0333f);
m_LastFrameTime = time;
}
}
void Application::Close()
{
m_Running = false;
}
float Application::GetTime()
{
return (float)glfwGetTime();
}
I think there is a problem with my glfw implementation. I cant figure out. How can i display the output? What should be corrected?
You are not swapping your buffers.
Add glfwSwapBuffers(m_WindowHandle); to the end of your run function.
There are two buffers - one currently shown and one you draw on.
This function swaps the front and back buffers of the specified window