entity editor, scene graph viewer, scene viewer basics done. Can rotate, translate and scale selected models.
This commit is contained in:
88
src/UIManager.cpp
Normal file
88
src/UIManager.cpp
Normal file
@@ -0,0 +1,88 @@
|
||||
//
|
||||
// Created by slinky on 5/11/26.
|
||||
//
|
||||
|
||||
#include "UIManager.h"
|
||||
|
||||
#include <ranges>
|
||||
|
||||
#include "imgui.h"
|
||||
#include "imgui_impl_glfw.h"
|
||||
#include "imgui_impl_opengl3.h"
|
||||
#include "imgui_internal.h"
|
||||
|
||||
std::unordered_map<std::string, std::shared_ptr<IUIPanel>> UIManager::uiPanels {};
|
||||
GLFWwindow* UIManager::window {nullptr};
|
||||
bool UIManager::updateDockspace {true};
|
||||
|
||||
void UIManager::init(GLFWwindow* _window) {
|
||||
IMGUI_CHECKVERSION();
|
||||
ImGui::CreateContext();
|
||||
|
||||
ImGuiIO& io = ImGui::GetIO();
|
||||
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
|
||||
|
||||
ImGui::StyleColorsDark();
|
||||
ImGui_ImplGlfw_InitForOpenGL(_window, true);
|
||||
ImGui_ImplOpenGL3_Init("#version 400");
|
||||
|
||||
window = _window;
|
||||
}
|
||||
|
||||
void UIManager::update(EditorContext& ctx) {
|
||||
ImGui_ImplOpenGL3_NewFrame();
|
||||
ImGui_ImplGlfw_NewFrame();
|
||||
|
||||
ImGui::NewFrame();
|
||||
{
|
||||
ImGuiWindowFlags window_flags = ImGuiWindowFlags_MenuBar | ImGuiWindowFlags_NoDocking;
|
||||
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;
|
||||
|
||||
ImGui::Begin("b_engine dockspace", nullptr, window_flags);
|
||||
ImGui::PopStyleVar(2);
|
||||
|
||||
ImGuiID dockspace_id = ImGui::GetID("bengine_dockspace");
|
||||
ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f), ImGuiDockNodeFlags_None);
|
||||
|
||||
if (updateDockspace) {
|
||||
updateDockspace = false;
|
||||
|
||||
ImGui::DockBuilderRemoveNode(dockspace_id);
|
||||
ImGui::DockBuilderAddNode(dockspace_id, ImGuiDockNodeFlags_DockSpace);
|
||||
ImGui::DockBuilderSetNodeSize(dockspace_id, viewport->Size);
|
||||
|
||||
ImGuiID dock_main_id = dockspace_id;
|
||||
|
||||
const ImGuiID dock_id_left =
|
||||
ImGui::DockBuilderSplitNode(dock_main_id, ImGuiDir_Left, 0.2f, nullptr, &dock_main_id);
|
||||
const ImGuiID dock_id_right =
|
||||
ImGui::DockBuilderSplitNode(dock_main_id, ImGuiDir_Right, 0.25f, nullptr, &dock_main_id);
|
||||
|
||||
ImGui::DockBuilderDockWindow("Hierarchy", dock_id_left);
|
||||
ImGui::DockBuilderDockWindow("Inspector", dock_id_right);
|
||||
ImGui::DockBuilderDockWindow("Scene", dock_main_id);
|
||||
|
||||
ImGui::DockBuilderFinish(dockspace_id);
|
||||
}
|
||||
|
||||
for (const auto &panel: uiPanels | std::views::values) {
|
||||
if (!panel) continue;
|
||||
panel->update(ctx);
|
||||
}
|
||||
|
||||
ImGui::End(); // dockspace
|
||||
}
|
||||
ImGui::Render();
|
||||
}
|
||||
|
||||
void UIManager::draw() {
|
||||
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
||||
}
|
||||
Reference in New Issue
Block a user