I'm using Windows 10, visual studio 2022. Backends: imgui_impl_glut.cpp and imgui_impl_opengl3.cpp
For now, i'm simply trying to get freeGLUT and ImGUI to work together properly. The problem is that when I create a window with ImGUI, it doesn't show the shape that GLUT draws. Without ImGUI, it draws a sphere perfectly well.
I've tried calling my rendering procedure for the sphere after the ImGui render cycle, but that hasn't worked. Here is my code:
#include <iostream>
#include <GLEW/glew.h>
#include <GL/freeglut.h>
#pragma comment(lib, "glew32.lib")
#include "imgui/imgui.h"
#include "imgui/imgui_impl_glut.h"
#include "imgui/imgui_impl_opengl3.h"
#ifdef _MSC_VER
#pragma warning (disable: 4505) // unreferenced local function has been removed
#endif
static bool show_demo_window = true;
static bool show_another_window = false;
static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
void Window(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-5.0, 5.0, -5.0, 5.0, 5.0, 200.0);
glMatrixMode(GL_MODELVIEW);
}
void my_display_code()
{
// Sample code taken from the ImGUI example files
{
static float f = 0.0f;
static int counter = 0;
ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it.
ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too)
ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state
ImGui::Checkbox("Another Window", &show_another_window);
ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::ColorEdit3("clear colour", (float*)&clear_color); // Edit 3 floats representing a color
if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated)
counter++;
ImGui::SameLine();
ImGui::Text("counter = %d", counter);
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
ImGui::End();
}
// Other sample window
if (show_another_window)
{
ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked)
ImGui::Text("Hello from another window!");
if (ImGui::Button("Close Me"))
show_another_window = false;
ImGui::End();
}
}
//Function where the rendering occurs
void Draw(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
my_display_code();
//Rendering
ImGui::Render();
ImGuiIO& io = ImGui::GetIO();
glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
gluLookAt(5.0f, 35.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f);
OrbitPath();
GLUquadric* quadric;
quadric = gluNewQuadric();
//Drwaing the Sun
glPushMatrix();
glRotatef(0.0, 0.0, 1.0, 0.0);
glTranslatef(0.0, 0.0f, 0.0);
glPushMatrix();
glRotatef(0, 1.0, 0.0, 0.0);
glRotatef(10, 0.0, 1.0, 0.0);
glColor3f(1.0f, 1.0f, 1.0f);
gluQuadricTexture(quadric, 1);
gluSphere(quadric, 5, 10.0, 10.0);
glPopMatrix();
glPopMatrix();
glutPostRedisplay();
glutSwapBuffers();
}
//Main function
int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitContextVersion(4, 2);
glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(700, 700);
glutInitWindowPosition(500, 0);
glutCreateWindow("Example");
glutDisplayFunc(Draw);
glutReshapeFunc(Window);
/**/
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
ImGui::StyleColorsDark();
ImGui_ImplGLUT_Init();
ImGui_ImplGLUT_InstallFuncs();
ImGui_ImplOpenGL3_Init();
/**/
glewExperimental = GL_TRUE;
glewInit();
glClearColor(0.0, 0.0, 0.0, 0.0);
glEnable(GL_DEPTH_TEST);
glutMainLoop();
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGLUT_Shutdown();
ImGui::DestroyContext();
}
Using ImGUI 1.87.