21#include <imgui/imgui.h>
22#include <imgui/imgui_internal.h>
30auto get_debug_mode_size() ->
float
39 const char* debug_mode_preview = modes[int(!debug_mode)];
40 ImGui::SetNextItemWidth(get_debug_mode_size());
44 ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(0.0f, 1.0f, 0.0f, 1.0f));
46 if(ImGui::BeginCombo(
"###DebugMode", debug_mode_preview))
48 if(ImGui::Selectable(modes[0]))
56 ImGui::SetItemTooltipEx(
"%s",
57 "Debug mode enales C# debugging\n"
58 "but reduces C# performance.\n"
59 "Switching to Debug mode will recompile\n"
60 "and reload all scripts.");
62 if(ImGui::Selectable(modes[1]))
70 ImGui::SetItemTooltipEx(
"%s",
71 "Release mode disables C# debugging\n"
72 "but improves C# performance.\n"
73 "Switching to Release mode will recompile\n"
74 "and reload all scripts.");
79 const char* debug_mode_tooltip = debug_mode ?
"Debugger Enabled" :
"Debugger Disabled";
81 ImGui::SetItemTooltipEx(
"%s", debug_mode_tooltip);
84 ImGui::SetItemTooltipEx(
"%s",
"Debugger Attached");
85 ImGui::PopStyleColor();
96 ImGuiWindowFlags header_flags = ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoTitleBar |
97 ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar |
98 ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_MenuBar;
99 ImGui::BeginChild(
"HEADER_menubar", ImVec2(0, ImGui::GetFrameHeight()),
false, header_flags);
102 if(ImGui::BeginMenuBar())
104 if(ImGui::BeginMenu(
"File"))
126 if(ImGui::MenuItem(
"Reload Project",
nullptr))
131 if(ImGui::MenuItem(
"Close Project",
nullptr))
138 if(ImGui::BeginMenu(
"Edit"))
142 auto undo = em.can_undo() ?
"Undo*" :
"Undo";
143 auto redo = em.can_redo() ?
"Redo*" :
"Redo";
144 if(ImGui::MenuItem(undo, ImGui::GetKeyCombinationName(
shortcuts::undo).c_str()))
149 if(ImGui::MenuItem(redo, ImGui::GetKeyCombinationName(
shortcuts::redo).c_str()))
159 if(ImGui::MenuItem(
"Editor Settings..."))
164 if(ImGui::MenuItem(
"Project Settings..."))
172 if(ImGui::BeginMenu(
"Deploy"))
174 if(ImGui::MenuItem(
"Deploy Project"))
182 if(ImGui::BeginMenu(
"Developer"))
185 if(ImGui::BeginMenu(
"Crash"))
187 if(ImGui::MenuItem(
"Abort"))
191 if(ImGui::MenuItem(
"Terminate"))
195 if(ImGui::MenuItem(
"Segmentation Fault"))
197 *(
volatile int*)0 = 0;
202 if(ImGui::BeginMenu(
"Recompile"))
204 if(ImGui::MenuItem(
"Shaders"))
209 if(ImGui::MenuItem(
"Textures"))
219 if(ImGui::MenuItem(
"Scripts"))
224 if(ImGui::MenuItem(
"All"))
233 if(ImGui::BeginMenu(
"Windows"))
235 if(ImGui::MenuItem(
"Style"))
239 if(ImGui::MenuItem(
"Animation"))
246 if(ImGui::BeginMenu(
"Help"))
248 if(ImGui::MenuItem(
"About"))
250 show_about_window_ =
true;
259 if(!ImGui::IsAnyItemActive())
302void header_panel::draw_play_toolbar(
rtti::context& ctx,
float header_size)
306 float width = ImGui::GetContentRegionAvail().x;
308 auto window_pos = ImGui::GetWindowPos();
309 auto window_size = ImGui::GetWindowSize();
311 const ImVec2 logo_bounds = ImVec2(500, header_size * 0.5f);
312 const ImVec2 logo_pos = ImVec2(window_pos.x + window_size.x * 0.5f - logo_bounds.x * 0.5f, window_pos.y);
314 ImVec2 points[5] = {ImVec2(logo_pos.x, logo_pos.y),
315 ImVec2(logo_pos.x + 20, logo_pos.y + logo_bounds.y + 4),
316 ImVec2(logo_pos.x + logo_bounds.x - 20, logo_pos.y + logo_bounds.y + 4),
317 ImVec2(logo_pos.x + logo_bounds.x, logo_pos.y),
318 ImVec2(logo_pos.x, logo_pos.y)};
320 const ImU32 poly_background = ImGui::GetColorU32(ImGuiCol_MenuBarBg);
321 auto poly_background_border_color = poly_background;
325 poly_background_border_color = ImGui::GetColorU32(ImVec4(0.0f, 0.5f, 0.0f, 0.5f));
329 poly_background_border_color = ImGui::GetColorU32(ImVec4(0.6f, 0.3f, 0.0f, 0.5f));
332 ImGui::GetWindowDrawList()->AddConvexPolyFilled(&points[0], 5, poly_background_border_color);
342 auto logo = fmt::format(
"{}", pm.get_name());
343 auto logo_size = ImGui::CalcTextSize(logo.c_str());
345 const ImVec2 logo_min = ImVec2(logo_pos.x + logo_bounds.x * 0.5f - logo_size.x * 0.5f,
346 logo_pos.y + (logo_bounds.y - logo_size.y) * 0.5f);
347 const ImVec2 logo_max = ImVec2(logo_min.x + logo_size.x, logo_min.y + logo_size.y);
348 auto logo_border_color = ImGui::GetColorU32(ImGuiCol_Text);
349 ImGui::GetWindowDrawList()->AddText(logo_min, logo_border_color, logo.c_str());
351 const auto& style = ImGui::GetStyle();
352 auto frame_padding = style.FramePadding;
353 auto item_spacing = style.ItemSpacing;
354 ImGui::AlignedItem(0.5f,
360 ImGuiKeyChord key_chord = ev.is_playing ? shortcuts::play_toggle : shortcuts::play_toggle;
361 bool play_pressed = ImGui::IsKeyChordPressed(key_chord);
363 auto& scripting = ctx.get_cached<script_system>();
364 bool has_errors = scripting.has_compilation_errors();
365 ImGui::BeginDisabled(has_errors);
368 play_pressed |= ImGui::Button(ev.is_playing ? ICON_MDI_STOP : ICON_MDI_PLAY);
372 play_pressed = false;
374 ImGui::SetItemTooltipEx(
"%s", ImGui::GetKeyChordName(key_chord));
377 ev.toggle_play_mode(ctx);
378 ImGui::FocusWindow(ImGui::FindWindowByName(ev.is_playing ? GAME_VIEW : SCENE_VIEW));
384 bool was_playing = ev.is_playing;
385 ev.toggle_pause(ctx);
389 ImGui::PushItemFlag(ImGuiItemFlags_ButtonRepeat,
true);
392 ev.skip_next_frame(ctx);
394 ImGui::PopItemFlag();
397 ImGui::BeginDisabled(ev.is_playing);
399 ImGui::EndDisabled();
404 auto time_scale = sim.get_time_scale();
405 ImGui::SetNextItemWidth(100);
406 if(ImGui::SliderFloat(
"###Time Scale", &time_scale, 0.0f, 1.0f))
408 sim.set_time_scale(time_scale);
410 ImGui::SetItemTooltipEx(
"%s",
"Time scale.");
413 auto vsync = rend.get_vsync();
414 if(ImGui::Checkbox(
"Vsync", &vsync))
416 rend.set_vsync(vsync);
420 ImGui::EndDisabled();
424 ImGui::SetItemTooltipEx(
426 "All compiler errors must be fixed before you can enter Play Mode!");
433 ImGuiWindowFlags header_flags = ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoBringToFrontOnFocus |
434 ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize |
435 ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoDecoration;
436 ImGuiViewport* viewport = ImGui::GetMainViewport();
438 ImGui::SetNextWindowPos(ImVec2(viewport->WorkPos.x, viewport->WorkPos.y));
439 ImGui::SetNextWindowSize(ImVec2(viewport->WorkSize.x, header_size));
440 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
441 ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 1.0f);
443 ImGui::SetNextWindowViewport(viewport->ID);
445 bool open = ImGui::Begin(
"HEADER",
nullptr, header_flags);
447 ImGui::PopStyleVar();
448 ImGui::PopStyleVar();
455 ImGui::PushStyleColor(ImGuiCol_ChildBg, ImGui::GetColorU32(ImGuiCol_MenuBarBg));
456 draw_menubar_child(ctx);
458 draw_play_toolbar(ctx, header_size);
459 ImGui::PopStyleColor();
465 draw_about_window(ctx);
470 if (!show_about_window_)
473 if(!ImGui::IsPopupOpen(
"About Unravel Engine"))
475 ImGui::OpenPopup(
"About Unravel Engine");
478 auto viewport = ImGui::GetMainViewport();
479 ImGui::SetNextWindowSize(ImVec2(viewport->WorkSize * 0.30f), ImGuiCond_Always);
480 ImGui::SetNextWindowPos(ImVec2(viewport->WorkSize.x * 0.5f, viewport->WorkSize.y * 0.5f), ImGuiCond_Always, ImVec2(0.5f, 0.5f));
481 if (ImGui::BeginPopupModal(
"About Unravel Engine", &show_about_window_, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize| ImGuiWindowFlags_NoMove))
484 const float title_scale = 1.5f;
486 ImGui::TextColored(ImVec4(0.4f, 0.6f, 1.0f, 1.0f),
"Unravel Engine");
495 "Unravel Engine is a modern, high-performance game engine designed for creating "
496 "interactive 3D and 2D applications. It features a component-based architecture, "
497 "powerful rendering capabilities, and an intuitive editor interface.");
503 const float section_scale = 1.2f;
505 ImGui::Text(
"Key Features");
509 ImGui::BulletText(
"Entity-Component-System");
510 ImGui::BulletText(
"PBR Rendering");
511 ImGui::BulletText(
"C# Scripting");
512 ImGui::BulletText(
"Physics Integration");
514 ImGui::BulletText(
"Real-time Editor");
515 ImGui::BulletText(
"Asset Management");
516 ImGui::BulletText(
"Cross-platform Support");
517 ImGui::BulletText(
"Extensible Architecture");
525 ImGui::Text(
"Build Information");
528 ImGui::Text(
"Build Date: %s", __DATE__);
529 ImGui::Text(
"Build Time: %s", __TIME__);
531 ImGui::Text(
"Configuration: Debug");
533 ImGui::Text(
"Configuration: Release");
541 ImGui::TextColored(ImVec4(0.5f, 0.5f, 0.5f, 1.0f),
542 "Copyright © %d. All rights reserved.", 2025);
auto get_project_settings_panel() -> project_settings_panel &
auto get_deploy_panel() -> deploy_panel &
auto get_editor_settings_panel() -> editor_settings_panel &
auto get_style_panel() -> style_panel &
auto get_animation_panel() -> animation_panel &
auto get_undo_redo_panel() -> undo_redo_panel &
#define ICON_MDI_BUG_CHECK
#define ICON_MDI_SKIP_NEXT
void PushFont(Font::Enum _font)
ImFont * GetFont(Font::Enum _font)
const ImGuiKeyCombination undo_history
const ImGuiKeyCombination new_scene
const ImGuiKeyCombination undo
const ImGuiKeyCombination redo
const ImGuiKeyCombination recompile_ui
const ImGuiKeyCombination redo_alt
const ImGuiKeyCombination save_scene_as
const ImGuiKeyCombination open_scene
const ImGuiKeyCombination save_scene
static auto close_project(rtti::context &ctx) -> bool
static void recompile_all()
static void recompile_ui()
static auto open_scene(rtti::context &ctx) -> bool
static void recompile_shaders()
static auto save_scene(rtti::context &ctx) -> bool
static auto new_scene(rtti::context &ctx) -> bool
static void recompile_scripts()
static void recompile_textures()
static auto reload_project(rtti::context &ctx) -> bool
static auto save_scene_as(rtti::context &ctx) -> bool
static auto is_debugger_attached() -> bool
static auto get_script_debug_mode() -> bool
static void set_script_debug_mode(bool debug)
static void set_needs_recompile(const std::string &protocol, bool now=false)