Switch to the docking code of dear imgui

simple_math_single_header
Martin Felis 2018-12-15 15:58:47 +01:00
parent f04a33d54b
commit eb67c1deaf
8 changed files with 139 additions and 58 deletions

View File

@ -263,8 +263,18 @@ void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data)
else else
glScissor((int)clip_rect.x, (int)clip_rect.y, (int)clip_rect.z, (int)clip_rect.w); // Support for GL 4.5's glClipControl(GL_UPPER_LEFT) glScissor((int)clip_rect.x, (int)clip_rect.y, (int)clip_rect.z, (int)clip_rect.w); // Support for GL 4.5's glClipControl(GL_UPPER_LEFT)
// Bind texture, Draw // MOD START (martin), 2018-03-09: support texture references that point to an address of a texture id
glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId); intptr_t ptr = (intptr_t)pcmd->TextureId;
if (ptr > 1024 * 1024)
{
GLTextureRef* texture_ref = (GLTextureRef*)pcmd->TextureId;
GLuint* texture_ptr = (GLuint*) texture_ref->mTextureIdPtr;
glBindTexture(GL_TEXTURE_2D, *texture_ptr);
} else {
glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId);
}
// MOD END (martin), 2018-03-09: support texture references that point to an address of a texture id
glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset); glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset);
} }
} }

View File

@ -19,9 +19,9 @@ include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11) CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X) CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11) if(COMPILER_SUPPORTS_CXX11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X) elseif(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -fPIC") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else() else()
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif() endif()
@ -31,6 +31,7 @@ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_DEBUG")
message(STATUS "Using compiler flags ${CMAKE_CXX_FLAGS}") message(STATUS "Using compiler flags ${CMAKE_CXX_FLAGS}")
add_definitions("-DIMGUI_IMPL_OPENGL_LOADER_GLAD")
INCLUDE_DIRECTORIES ( INCLUDE_DIRECTORIES (
${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_BINARY_DIR}
@ -53,7 +54,6 @@ INCLUDE_DIRECTORIES (
3rdparty/imgui 3rdparty/imgui
3rdparty/imgui/examples/ 3rdparty/imgui/examples/
3rdparty/imgui/examples/libs/gl3w
) )
SUBDIRS ( SUBDIRS (
@ -72,15 +72,15 @@ SET ( protot_SRCS
src/RuntimeModuleManager.cc src/RuntimeModuleManager.cc
src/Utils.cc src/Utils.cc
3rdparty/glfw/deps/glad.c
3rdparty/imgui/imgui.cpp 3rdparty/imgui/imgui.cpp
3rdparty/imgui/imgui_draw.cpp 3rdparty/imgui/imgui_draw.cpp
3rdparty/imgui/imgui_widgets.cpp 3rdparty/imgui/imgui_widgets.cpp
3rdparty/imgui/imgui_demo.cpp 3rdparty/imgui/imgui_demo.cpp
3rdparty/imgui/examples/libs/gl3w/GL/gl3w.c
3rdparty/imgui/examples/imgui_impl_glfw.cpp 3rdparty/imgui/examples/imgui_impl_glfw.cpp
3rdparty/imgui/examples/imgui_impl_opengl3.cpp 3rdparty/imgui/examples/imgui_impl_opengl3.cpp
3rdparty/imgui_dock_lumix/imgui_dock.cpp # 3rdparty/imgui_dock_lumix/imgui_dock.cpp
) )
SET (PROTOT_SOURCE_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR}) SET (PROTOT_SOURCE_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})

View File

@ -1,6 +1,6 @@
#include <GL/gl3w.h> // This example is using gl3w to access OpenGL functions (because it is small). You may use glew/glad/glLoadGen/etc. whatever already works for you. #include <glad/glad.h> // This example is using gl3w to access OpenGL functions (because it is small). You may use glew/glad/glLoadGen/etc. whatever already works for you.
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
#include <GLFW/glfw3native.h> //#include <GLFW/glfw3native.h>
#include "Globals.h" #include "Globals.h"
@ -55,9 +55,9 @@ static void opengl_error_callback(
const GLchar* message, const GLchar* message,
const void* userParam ) const void* userParam )
{ {
gLog ("OpenGL Error: %s type %0x%x, severity = 0x%x, message = %s", // gLog ("OpenGL Error: %s type %0x%x, severity = 0x%x, message = %s",
( type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : "" ), // ( type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : "" ),
type, severity, message ); // type, severity, message );
} }
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
@ -110,24 +110,24 @@ int main(void)
glfwSetErrorCallback(error_callback); glfwSetErrorCallback(error_callback);
glfwInit(); glfwInit();
const char* glsl_version = "#version 150"; const char* glsl_version = "#version 130";
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_API); glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_API);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
glfwWindowHint(GLFW_SAMPLES, 16); glfwWindowHint(GLFW_SAMPLES, 16);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#if __APPLE__ #if __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif #endif
gWindow = glfwCreateWindow(800, 600, "ProtoT", NULL, NULL); gWindow = glfwCreateWindow(800, 600, "ProtoT", NULL, NULL);
assert(gWindow != NULL);
glfwMakeContextCurrent(gWindow); glfwMakeContextCurrent(gWindow);
glfwSwapInterval(1); glfwSwapInterval(1);
gl3wInit();
int width, height; // Initialize OpenGL loader
glfwGetWindowSize(gWindow, &width, &height); gladLoadGLLoader((GLADloadproc) glfwGetProcAddress);
glfwSetKeyCallback(gWindow, key_callback); glfwSetKeyCallback(gWindow, key_callback);
glfwSetScrollCallback (gWindow, mouse_scroll_callback); glfwSetScrollCallback (gWindow, mouse_scroll_callback);
@ -136,17 +136,31 @@ int main(void)
std::cout << "GLSL Version : " << glGetString(GL_SHADING_LANGUAGE_VERSION) << endl; std::cout << "GLSL Version : " << glGetString(GL_SHADING_LANGUAGE_VERSION) << endl;
// During init, enable debug output // During init, enable debug output
glEnable ( GL_DEBUG_OUTPUT ); // glEnable ( GL_DEBUG_OUTPUT );
glDebugMessageCallback( (GLDEBUGPROC) opengl_error_callback, 0 ); // glDebugMessageCallback( (GLDEBUGPROC) opengl_error_callback, 0 );
// imgui initialization. // imgui initialization.
IMGUI_CHECKVERSION();
ImGui::CreateContext(); ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io; ImGuiIO& io = ImGui::GetIO(); (void)io;
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
// io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
GuiInputState gui_input_state; GuiInputState gui_input_state;
gGuiInputState = &gui_input_state; gGuiInputState = &gui_input_state;
ImGui_ImplGlfw_InitForOpenGL(gWindow, true); ImGui_ImplGlfw_InitForOpenGL(gWindow, true);
ImGui_ImplOpenGL3_Init(glsl_version); ImGui_ImplOpenGL3_Init(glsl_version);
// Setup Style
ImGui::StyleColorsDark();
//ImGui::StyleColorsClassic();
ImGuiStyle& style = ImGui::GetStyle();
style.WindowRounding = 0.0f; // When viewports are enabled it is preferable to disable WinodwRounding
style.Colors[ImGuiCol_WindowBg].w = 1.0f; // When viewports are enabled it is preferable to disable WindowBg alpha
// FileModificationObserver // FileModificationObserver
FileModificationObserver file_modification_observer; FileModificationObserver file_modification_observer;
gFileModificationObserver = &file_modification_observer; gFileModificationObserver = &file_modification_observer;
@ -176,19 +190,23 @@ int main(void)
double frame_delta_time = 0.0; double frame_delta_time = 0.0;
uint64_t frame_counter = 0; uint64_t frame_counter = 0;
bool draw_imgui_demo = false; bool show_demo_window = false;
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
while(!glfwWindowShouldClose(gWindow)) { while(!glfwWindowShouldClose(gWindow)) {
frame_counter++; frame_counter++;
// Start the imgui frame such that widgets can be submitted // Start the imgui frame such that widgets can be submitted
handle_mouse(); handle_mouse();
glfwGetWindowSize(gWindow, &width, &height);
glViewport(0, 0, width, height);
glfwPollEvents(); glfwPollEvents();
ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame(); ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
if (show_demo_window)
ImGui::ShowDemoWindow(&show_demo_window);
if (module_manager.CheckModulesChanged()) { if (module_manager.CheckModulesChanged()) {
gLog("Detected module update at frame %d. Unloading all modules.", frame_counter); gLog("Detected module update at frame %d. Unloading all modules.", frame_counter);
@ -211,28 +229,85 @@ int main(void)
assert (gTimer->mDeltaTime >= 0.0f); assert (gTimer->mDeltaTime >= 0.0f);
int width, height; int width, height;
glfwGetWindowSize(gWindow, &width, &height);
ImGui::BeginMainMenuBar(); ImGui::BeginMainMenuBar();
if (ImGui::BeginMenu("Dialogs")) if (ImGui::BeginMenu("Dialogs"))
{ {
ImGui::Checkbox("ImGui Demo", &draw_imgui_demo); ImGui::Checkbox("ImGui Demo", &show_demo_window);
ImGui::EndMenu(); ImGui::EndMenu();
} }
float menu_bar_height = ImGui::GetWindowHeight(); float menu_bar_height = ImGui::GetWindowHeight();
ImGui::EndMainMenuBar(); ImGui::EndMainMenuBar();
if (draw_imgui_demo) if (show_demo_window)
ImGui::ShowDemoWindow(); ImGui::ShowDemoWindow();
static bool opt_fullscreen_persistant = true;
static ImGuiDockNodeFlags opt_flags = ImGuiDockNodeFlags_None;
bool opt_fullscreen = opt_fullscreen_persistant;
ImGui::RootDock(ImVec2(0.0f, menu_bar_height), ImVec2(width, height - menu_bar_height)); // We are using the ImGuiWindowFlags_NoDocking flag to make the parent window not dockable into,
// because it would be confusing to have two docking targets within each others.
ImGuiWindowFlags window_flags = ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoDocking;
if (opt_fullscreen)
{
ImGuiViewport* viewport = ImGui::GetMainViewport();
ImGui::SetNextWindowPos(viewport->Pos);
ImGui::SetNextWindowSize(viewport->Size);
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;
}
// When using ImGuiDockNodeFlags_PassthruDockspace, DockSpace() will render our background and handle the pass-thru hole, so we ask Begin() to not render a background.
if (opt_flags & ImGuiDockNodeFlags_PassthruDockspace)
window_flags |= ImGuiWindowFlags_NoBackground;
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
ImGui::Begin("DockSpace Demo", NULL, window_flags);
ImGui::PopStyleVar();
if (opt_fullscreen)
ImGui::PopStyleVar(2);
if (io.ConfigFlags & ImGuiConfigFlags_DockingEnable) {
ImGuiID dockspace_id = ImGui::GetID("MyDockspace");
ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f), opt_flags);
} else {
gLog("Error: no docking not enabled");
}
ImGui::End();
module_manager.Update(gTimer->mDeltaTime); module_manager.Update(gTimer->mDeltaTime);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
// Rendering
ImGui::Render();
int display_w, display_h;
glfwMakeContextCurrent(gWindow);
glfwGetFramebufferSize(gWindow, &display_w, &display_h);
glViewport(0, 0, display_w, display_h);
glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w);
glClear(GL_COLOR_BUFFER_BIT);
ImDrawData* draw_data = ImGui::GetDrawData();
assert (draw_data != NULL);
ImGui_ImplOpenGL3_RenderDrawData(draw_data);
// Update and Render additional Platform Windows
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
{
ImGui::UpdatePlatformWindows();
ImGui::RenderPlatformWindowsDefault();
}
glfwMakeContextCurrent(gWindow);
glfwSwapBuffers(gWindow);
// Send the application to sleep if we have some time left for this frame // Send the application to sleep if we have some time left for this frame
double frame_target_time = 1.0 / module_manager.mTargetFPS; double frame_target_time = 1.0 / module_manager.mTargetFPS;
@ -243,17 +318,12 @@ int main(void)
if (glfwGetKey(gWindow, GLFW_KEY_F5) == GLFW_PRESS) { if (glfwGetKey(gWindow, GLFW_KEY_F5) == GLFW_PRESS) {
gFileModificationObserver->Update(); gFileModificationObserver->Update();
} }
glfwSwapBuffers(gWindow);
} }
ImGui::SaveDock(); module_manager.UnregisterModules();
module_manager.UnregisterModules();
gRenderer = nullptr; gRenderer = nullptr;
ImGui::ShutdownDock();
ImGui_ImplOpenGL3_Shutdown(); ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown(); ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext(); ImGui::DestroyContext();

View File

@ -8,7 +8,6 @@
#include "Serializer.h" #include "Serializer.h"
#include "imgui/imgui.h" #include "imgui/imgui.h"
#include "imgui_dock.h"
using namespace SimpleMath::GL; using namespace SimpleMath::GL;
@ -284,8 +283,8 @@ void Light::UpdateSplits(const Camera& camera) {
Matrix44f light_matrix = LookAt (mPosition, mPosition + mDirection, Vector3f (0.f, 1.0f, 0.0f)); Matrix44f light_matrix = LookAt (mPosition, mPosition + mDirection, Vector3f (0.f, 1.0f, 0.0f));
Matrix44f light_matrix_inv = light_matrix.inverse(); Matrix44f light_matrix_inv = light_matrix.inverse();
mShadowSplits[0] = near + length * 0.05; mShadowSplits[0] = near + length * 0.03;
mShadowSplits[1] = near + length * 0.15; mShadowSplits[1] = near + length * 0.10;
mShadowSplits[2] = near + length * 0.4; mShadowSplits[2] = near + length * 0.4;
mShadowSplits[3] = far; mShadowSplits[3] = far;
@ -1013,7 +1012,7 @@ void Renderer::RenderScene(RenderProgram &program, const Camera& camera) {
// TranslateMat44(0.0f, 2.0f, 2.0f), // TranslateMat44(0.0f, 2.0f, 2.0f),
// Vector3f (0.4f, 0.2f, 0.9f) // Vector3f (0.4f, 0.2f, 0.9f)
// ); // );
//
DebugDrawBone( DebugDrawBone(
program, program,
@ -1024,7 +1023,7 @@ void Renderer::RenderScene(RenderProgram &program, const Camera& camera) {
} }
void Renderer::DrawGui() { void Renderer::DrawGui() {
if (ImGui::BeginDock("Scene")) { if (ImGui::Begin("Scene")) {
ImGui::RadioButton("Default", &sRendererSettings.RenderMode, 0); ImGui::SameLine(); ImGui::RadioButton("Default", &sRendererSettings.RenderMode, 0); ImGui::SameLine();
ImGui::RadioButton("Color", &sRendererSettings.RenderMode, 1); ImGui::SameLine(); ImGui::RadioButton("Color", &sRendererSettings.RenderMode, 1); ImGui::SameLine();
ImGui::RadioButton("Depth", &sRendererSettings.RenderMode, 2); ImGui::SameLine(); ImGui::RadioButton("Depth", &sRendererSettings.RenderMode, 2); ImGui::SameLine();
@ -1067,14 +1066,14 @@ void Renderer::DrawGui() {
); );
} }
ImGui::EndDock(); ImGui::End();
if (ImGui::BeginDock("Light Settings")) { if (ImGui::Begin("Light Settings")) {
mLight.DrawGui(); mLight.DrawGui();
} }
ImGui::EndDock(); ImGui::End();
if (ImGui::BeginDock("Render Settings")) { if (ImGui::Begin("Render Settings")) {
ImGui::Text("Camera"); ImGui::Text("Camera");
mCamera.DrawGui(); mCamera.DrawGui();
@ -1095,12 +1094,12 @@ void Renderer::DrawGui() {
} }
} }
} }
ImGui::EndDock(); ImGui::End();
if (ImGui::BeginDock("Asset")) { if (ImGui::Begin("Asset")) {
gAssetFile.DrawGui(); gAssetFile.DrawGui();
} }
ImGui::EndDock(); ImGui::End();
} }
void Renderer::InitializeSSAOKernelAndNoise() { void Renderer::InitializeSSAOKernelAndNoise() {

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <cstdint> #include <cstdint>
#include <glad/glad.h>
#include <map> #include <map>
#include <vector> #include <vector>
@ -31,13 +32,13 @@ struct Light {
float mShadowBias = 0.003; float mShadowBias = 0.003;
float mShowCascadesAlpha = 0.0f; float mShowCascadesAlpha = 0.0f;
bool mDebugDrawSplitViewBounds = true; bool mDebugDrawSplitViewBounds = false;
bool mDebugDrawSplitWorldBounds = true; bool mDebugDrawSplitWorldBounds = false;
bool mDebugDrawSplitLightBounds = true; bool mDebugDrawSplitLightBounds = false;
Matrix44f mLightSpaceMatrix; Matrix44f mLightSpaceMatrix;
Vector4f mShadowSplits = Vector4f (0.0, 0.1, 0.4, 1.0); Vector4f mShadowSplits = Vector4f (0.0, 0.05, 0.3, 1.0);
Matrix44f mSplitViewFrustum[4]; Matrix44f mSplitViewFrustum[4];
Matrix44f mSplitLightFrustum[4]; Matrix44f mSplitLightFrustum[4];
@ -51,7 +52,7 @@ struct Light {
mPosition (Vector3f(0.f, 3, 0.0f)), mPosition (Vector3f(0.f, 3, 0.0f)),
mDirection (Vector3f(1.f, 1.f, 1.f)), mDirection (Vector3f(1.f, 1.f, 1.f)),
mShadowMapBias (0.004f), mShadowMapBias (0.004f),
mShadowMapSize (512), mShadowMapSize (2048),
mNear (-10.0f), mNear (-10.0f),
mFar (15.f), mFar (15.f),
mBBoxSize (35.f), mBBoxSize (35.f),
@ -73,7 +74,7 @@ struct Renderer {
bool mInitialized = false; bool mInitialized = false;
bool mIsSSAOEnabled = false; bool mIsSSAOEnabled = false;
bool mUseDeferred = false; bool mUseDeferred = false;
bool mDrawDebugCamera = true; bool mDrawDebugCamera = false;
uint32_t mWidth = 1; uint32_t mWidth = 1;
uint32_t mHeight = 1; uint32_t mHeight = 1;

View File

@ -761,6 +761,7 @@ void VertexArrayMesh::SetIndexData(const GLuint* indices, const int& count) {
} }
void VertexArrayMesh::Draw(GLenum mode) { void VertexArrayMesh::Draw(GLenum mode) {
this->mVertexArray->Bind();
assert(mVertexArray->IsBound()); assert(mVertexArray->IsBound());
if (mIndexBuffer == -1) { if (mIndexBuffer == -1) {

View File

@ -3,7 +3,7 @@
#pragma once #pragma once
#include <GL/gl3w.h> // This example is using gl3w to access OpenGL functions (because it is small). You may use glew/glad/glLoadGen/etc. whatever already works for you. #include <glad/glad.h> // This example is using gl3w to access OpenGL functions (because it is small). You may use glew/glad/glLoadGen/etc. whatever already works for you.
#include "FileModificationObserver.h" #include "FileModificationObserver.h"

View File

@ -1,7 +1,7 @@
#include "RuntimeModule.h" #include "RuntimeModule.h"
#include "Globals.h" #include "Globals.h"
#include <GL/gl3w.h> // This example is using gl3w to access OpenGL functions (because it is small). You may use glew/glad/glLoadGen/etc. whatever already works for you. #include <glad/glad.h> // This example is using gl3w to access OpenGL functions (because it is small). You may use glew/glad/glLoadGen/etc. whatever already works for you.
#include "imgui/imgui.h" #include "imgui/imgui.h"
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>