Setup dock builder for editor GUI
This commit is contained in:
@@ -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 );
|
||||
|
||||
55
src/engine/gui/dockspace.hpp
Normal file
55
src/engine/gui/dockspace.hpp
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user