ImGui는 여러 플랫폼을 지원하는 C++ GUI 라이브러리이다. ImGui를 사용하는 방법은 다음과 같다.
1. 컴파일링/링킹
ImGui를 자신의 프로젝트에서 사용하기 위한 컴파일, 링킹 단계이다. ImGui 위키의 내용을 따라 다음과 같이 진행해주면 된다.
master
혹은docking
브랜치 중에서 하나를 선택한다.- 선택한 브랜치를 자신의 프로젝트의 서브모듈로 추가하거나, 압축을 풀어 프로젝트 경로에 위치시킨다.
- 자신의 프로젝트나 빌드 시스템에 따라서 ImGui의 파일들을 추가해준다. 선택한 파일들은 프로젝트에 컴파일/링킹된다.
- 루트 디렉토리에 있는 모든
*.cpp
,*.h
파일을 추가한다. backends
경로에 있는imgui_impl_xxxx
라는 이름을 가진 파일들을 자신의 개발 환경에 맞춰 추가해야 한다. ImGui는 별도의.lib
파일을 제공하지 않고,backends
에서 선택한 파일을 빌드하여 사용하기 때문에 다음과 같이 빌드를 위한 소스 파일을 만들어 준다. 이 파일이 빌드되어 생성된 바이너리를 이용해서 프로젝트 내에서 ImGui를 사용할 수 있게 된다.
- 루트 디렉토리에 있는 모든
// ImGuiBuild.cpp
// glfw + openl3 사용 예제
#include <glad/glad.h> // for imgui_opengl3.cpp
#include "backends/imgui_impl_glfw.cpp"
#include "backends/imgui_impl_opengl3.cpp"
2. ImGui & Backends 설정하기
이제 프로젝트에서 ImGui와 Backends
를 사용할 차례이다. 각 플랫폼에 따른 세부적인 구현 내용들은 ImGui 프로젝트의 example
하위 경로에서 찾아볼 수 있다. glfw, opengl3을 사용하는 일반적인 코드 작성 루틴은 다음과 같다.
- ImGui를 사용하려는 파일에 메인 라이브러리(
imgui.h
)와 백엔드(imgui_impl_glfw.h
,imgui_impl_opengl3.h
)를 추가해준다.
#include "imgui.h"
#include "imgui_impl_glfw.h"
#include "imgui_impl_opengl3.h"
ImGui::CreateContext
함수를 이용해 컨텍스트를 생성해준다.- 백엔드에서 설정한 플랫폼의 초기화를 진행해준다.
// Setup Dear ImGui context
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // IF using Docking Branch
// Setup Platform/Renderer backends
ImGui_ImplGlfw_InitForOpenGL(YOUR_WINDOW, true); // Second param install_callback=true will install GLFW callbacks and chain to existing ones.
ImGui_ImplOpenGL3_Init();
- 메인 루프의 시작(Start).(poll events +
ImGui_ImplXXX_NewFrame()
+ImGui::NewFrame()
로 구성됨)
// (Your code calls glfwPollEvents())
// ...
// Start the Dear ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
ImGui::ShowDemoWindow(); // Show demo window! :)
- 메인 루프의 끝(End).(
ImGui::Render()
+ImGui_ImplXXX_Render()
로 구성됨)
// Rendering
// (Your code clears your framebuffer, renders your other stuff etc.)
ImGui::Render();
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
// (Your code calls glfwSwapBuffers() etc.)
- 대부분의 백엔드는 이벤트 처리를 위한 함수를 제공한다.
- 백엔드 및 ImGui 컨텍스트 종료
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
- 어플리케이션의 입력 로직에서
ImGui::GetIO()
의WantCaptureMouse/WantCaptureKeyboard
를 폴링하여 ImGui가 기본 앱에서 마우스/키보드 입력을 차단하는지 확인할 수 있다. 예를 들어 창을 호버링하면WantCaptureMouse
가 true로 설정되면, 마우스 이벤트를 메인 어플리케이션으로 전달하지 않는 전략을 취할 수 있다.
'프로그래밍 언어 > C++' 카테고리의 다른 글
std::vector의 emplace, emplace_back 사용시 주의사항 (0) | 2024.09.09 |
---|---|
const, constexpr, consteval (0) | 2024.09.05 |
환경설정(vcpkg 설치) (0) | 2023.04.28 |
함수 오버로딩과 포인터 (0) | 2023.04.03 |
포인터와 const (0) | 2023.03.31 |