Setup dock builder for editor GUI

This commit is contained in:
2024-07-29 03:22:33 -04:00
parent 8fe9c94b6b
commit d72aefb96b
2 changed files with 120 additions and 34 deletions

View File

@@ -14,13 +14,15 @@
#include <imgui.h>
#pragma GCC diagnostic pop
#include <imgui_internal.h>
#include "dockspace.hpp"
#include "engine/descriptors/DescriptorPool.hpp"
#include "engine/filesystem/FileBrowser.hpp"
#include "engine/model/Model.hpp"
#include "engine/rendering/Device.hpp"
#include "engine/rendering/Renderer.hpp"
#include "engine/tree/octtree/OctTreeNode.hpp"
#include "preview.hpp"
namespace fgl::engine::gui
{
@@ -74,8 +76,6 @@ namespace fgl::engine::gui
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
ImGui::DockSpaceOverViewport( 0, nullptr, ImGuiDockNodeFlags_PassthruCentralNode );
ImGui::Begin( "Main" );
}
@@ -92,56 +92,87 @@ namespace fgl::engine::gui
//ImGui::RenderPlatformWindowsDefault();
}
/*
ImGui DockBuilder is still very much not ready for use.
void prepareDock()
inline void prepareDock( ImGuiID& primary_id )
{
// Docks seem utterly broken.
ImGuiID primary_id { ImGui::GetID( "WindowGroup" ) };
ImGui::DockSpaceOverViewport( primary_id, ImGui::GetMainViewport() );
ImGui::DockBuilderRemoveNode( primary_id );
ImGui::DockBuilderAddNode( primary_id, ImGuiDockNodeFlags_DockSpace );
ImGui::DockBuilderAddNode( primary_id, ImGuiDockNodeFlags_DockSpace | ImGuiDockNodeFlags_PassthruCentralNode );
const auto viewport { ImGui::GetMainViewport() };
ImGui::DockBuilderSetNodeSize( primary_id, viewport->Size );
ImGui::DockBuilderSetNodeSize( primary_id, ImGui::GetMainViewport()->WorkSize );
ImGuiID right {};
auto left { ImGui::DockBuilderSplitNode( primary_id, ImGuiDir_Left, 0.2f, nullptr, &right ) };
ImGui::DockBuilderAddNode( right );
auto center { ImGui::DockBuilderSplitNode( right, ImGuiDir_Left, 0.2f, nullptr, &right ) };
constexpr float left_bar_size { 0.2f };
constexpr float right_bar_size { 0.2f };
constexpr float bottom_bar_size { 0.4f };
ImGui::DockBuilderAddNode( center, ImGuiDockNodeFlags_DockSpace );
ImGui::DockBuilderAddNode( left, ImGuiDockNodeFlags_DockSpace );
ImGui::DockBuilderAddNode( right, ImGuiDockNodeFlags_DockSpace );
ImGuiID lb_node {
ImGui::DockBuilderSplitNode( primary_id, ImGuiDir_Left, left_bar_size, nullptr, &primary_id )
};
ImGuiID left_up {};
auto left_down { ImGui::DockBuilderSplitNode( primary_id, ImGuiDir_Down, 0.2f, nullptr, &left_up ) };
ImGuiID rb_node {
ImGui::DockBuilderSplitNode( primary_id, ImGuiDir_Right, right_bar_size, nullptr, &primary_id )
};
ImGui::DockBuilderDockWindow( "Scene", left_up );
ImGui::DockBuilderDockWindow( "Main", left_down );
ImGuiID bb_node {
ImGui::DockBuilderSplitNode( primary_id, ImGuiDir_Down, bottom_bar_size, nullptr, &primary_id )
};
ImGui::DockBuilderDockWindow( "Entity info", right );
ImGuiID mv_node { primary_id };
//ImGuiID mv_node { ImGui::DockBuilderSplitNode( primary_id, ImGuiDir_Up, 1.0f - 0.3f, &primary_id, nullptr ) };
ImGuiID up {};
auto down { ImGui::DockBuilderSplitNode( center, ImGuiDir_Down, 0.2f, nullptr, &up ) };
ImGui::DockBuilderDockWindow( "Scene", lb_node );
ImGui::DockBuilderDockWindow( "RenderOutputs", up );
ImGui::DockBuilderDockWindow( "File Picker", down );
//ImGui::DockBuilderDockWindow( "Main", mv_node );
ImGui::DockBuilderDockWindow( "Camera: 0", mv_node );
ImGui::DockBuilderDockWindow( "Entity info", rb_node );
ImGui::DockBuilderDockWindow( "File Picker", bb_node );
ImGui::DockBuilderFinish( primary_id );
}
*/
// ImGui DockBuilder is still very much not ready for use.
// But let's try it anyways
void drawDock()
{
// ImGui::PushStyleVar( ImGuiStyleVar_WindowPadding, ImVec2( 0.0f, 0.0f ) );
// Docks seem utterly broken.
ImGuiID primary_id {
ImGui::DockSpaceOverViewport( ImGui::GetID( "MainWindowDockspace" ), ImGui::GetMainViewport() )
};
// +--------------------------------------------------------------------+
// | | | |
// | | | |
// | | | |
// | | mv | |
// | | | |
// | | | |
// | lb | | rb |
// | | | |
// | | | |
// | |--------------------------------------------------| |
// | | bb | |
// | | | |
// +--------+---------------------------------------------------+-------+
static std::once_flag flag;
std::call_once( flag, prepareDock, primary_id );
ImGui::DockBuilderSetNodePos( primary_id, ImVec2( 0.0f, 0.0f ) );
ImGui::DockBuilderSetNodeSize( primary_id, ImGui::GetMainViewport()->WorkSize );
// ImGui::PopStyleVar();
}
void drawMainGUI( FrameInfo& info )
{
ZoneScoped;
beginImGui();
// TODO: Maybe play with docks again some other time
//static std::once_flag flag;
//std::call_once( flag, prepareDock );
// ImGui::ShowDemoWindow();
drawDock();
drawCameraOutputs( info );
drawEntityGUI( info );

View File

@@ -0,0 +1,55 @@
//
// Created by kj16609 on 7/28/24.
//
#pragma once
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Weffc++"
#pragma GCC diagnostic ignored "-Wold-style-cast"
#pragma GCC diagnostic ignored "-Wconversion"
#include <imgui.h>
#pragma GCC diagnostic pop
namespace ImGui
{
ImGuiID DockSpaceOverViewportEx(const ImGuiViewport* viewport, ImGuiDockNodeFlags dockspace_flags, const ImGuiWindowClass* window_class, auto DockBuilder)
{
if (viewport == NULL)
viewport = GetMainViewport();
SetNextWindowPos(viewport->WorkPos);
SetNextWindowSize(viewport->WorkSize);
SetNextWindowViewport(viewport->ID);
ImGuiWindowFlags host_window_flags = 0;
host_window_flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDocking;
host_window_flags |= ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoNavFocus;
if (dockspace_flags & ImGuiDockNodeFlags_PassthruCentralNode)
host_window_flags |= ImGuiWindowFlags_NoBackground;
char label[32];
ImFormatString(label, IM_ARRAYSIZE(label), "DockSpaceViewport_%08X", viewport->ID);
PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
PushStyleVar(ImGuiStyleVar_WindowBorderSize, 0.0f);
PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
Begin(label, NULL, host_window_flags);
PopStyleVar(3);
ImGuiID dockspace_id = GetID("DockSpace");
/// vvvv ---- call DockBuilder callback if no docking exists --- vvvv
if(DockBuilderGetNode(dockspace_id) == nullptr)
{
DockBuilder(dockspace_id);
}
/// ^^^^ ---------------------------------------------------- ^^^^
DockSpace(dockspace_id, ImVec2(0.0f, 0.0f), dockspace_flags, window_class);
End();
return dockspace_id;
}
}