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"))
186 if(ImGui::MenuItem(
"Crash(Abort)"))
190 if(ImGui::MenuItem(
"Crash(Terminate)"))
194 if(ImGui::MenuItem(
"Crash(SIGSEGV)"))
196 *(
volatile int*)0 = 0;
199 if(ImGui::MenuItem(
"Recompile Shaders"))
204 if(ImGui::MenuItem(
"Recompile Textures"))
209 if(ImGui::MenuItem(
"Recompile UI"))
214 if(ImGui::MenuItem(
"Recompile Scripts"))
219 if(ImGui::MenuItem(
"Recompile All"))
226 if(ImGui::BeginMenu(
"Windows"))
228 if(ImGui::MenuItem(
"Style"))
232 if(ImGui::MenuItem(
"Animation"))
239 if(ImGui::BeginMenu(
"Help"))
241 if(ImGui::MenuItem(
"About"))
243 show_about_window_ =
true;
252 if(!ImGui::IsAnyItemActive())
295void header_panel::draw_play_toolbar(
rtti::context& ctx,
float header_size)
299 float width = ImGui::GetContentRegionAvail().x;
301 auto window_pos = ImGui::GetWindowPos();
302 auto window_size = ImGui::GetWindowSize();
304 const ImVec2 logo_bounds = ImVec2(500, header_size * 0.5f);
305 const ImVec2 logo_pos = ImVec2(window_pos.x + window_size.x * 0.5f - logo_bounds.x * 0.5f, window_pos.y);
307 ImVec2 points[5] = {ImVec2(logo_pos.x, logo_pos.y),
308 ImVec2(logo_pos.x + 20, logo_pos.y + logo_bounds.y + 4),
309 ImVec2(logo_pos.x + logo_bounds.x - 20, logo_pos.y + logo_bounds.y + 4),
310 ImVec2(logo_pos.x + logo_bounds.x, logo_pos.y),
311 ImVec2(logo_pos.x, logo_pos.y)};
313 const ImU32 poly_background = ImGui::GetColorU32(ImGuiCol_MenuBarBg);
314 auto poly_background_border_color = poly_background;
318 poly_background_border_color = ImGui::GetColorU32(ImVec4(0.0f, 0.5f, 0.0f, 0.5f));
322 poly_background_border_color = ImGui::GetColorU32(ImVec4(0.6f, 0.3f, 0.0f, 0.5f));
325 ImGui::GetWindowDrawList()->AddConvexPolyFilled(&points[0], 5, poly_background_border_color);
335 auto logo = fmt::format(
"{}", pm.get_name());
336 auto logo_size = ImGui::CalcTextSize(logo.c_str());
338 const ImVec2 logo_min = ImVec2(logo_pos.x + logo_bounds.x * 0.5f - logo_size.x * 0.5f,
339 logo_pos.y + (logo_bounds.y - logo_size.y) * 0.5f);
340 const ImVec2 logo_max = ImVec2(logo_min.x + logo_size.x, logo_min.y + logo_size.y);
341 auto logo_border_color = ImGui::GetColorU32(ImGuiCol_Text);
342 ImGui::GetWindowDrawList()->AddText(logo_min, logo_border_color, logo.c_str());
344 const auto& style = ImGui::GetStyle();
345 auto frame_padding = style.FramePadding;
346 auto item_spacing = style.ItemSpacing;
347 ImGui::AlignedItem(0.5f,
353 ImGuiKeyChord key_chord = ev.is_playing ? shortcuts::play_toggle : shortcuts::play_toggle;
354 bool play_pressed = ImGui::IsKeyChordPressed(key_chord);
356 auto& scripting = ctx.get_cached<script_system>();
357 bool has_errors = scripting.has_compilation_errors();
358 ImGui::BeginDisabled(has_errors);
361 play_pressed |= ImGui::Button(ev.is_playing ? ICON_MDI_STOP : ICON_MDI_PLAY);
365 play_pressed = false;
367 ImGui::SetItemTooltipEx(
"%s", ImGui::GetKeyChordName(key_chord));
370 ev.toggle_play_mode(ctx);
371 ImGui::FocusWindow(ImGui::FindWindowByName(ev.is_playing ? GAME_VIEW : SCENE_VIEW));
377 bool was_playing = ev.is_playing;
378 ev.toggle_pause(ctx);
382 ImGui::PushItemFlag(ImGuiItemFlags_ButtonRepeat,
true);
385 ev.skip_next_frame(ctx);
387 ImGui::PopItemFlag();
390 ImGui::BeginDisabled(ev.is_playing);
392 ImGui::EndDisabled();
397 auto time_scale = sim.get_time_scale();
398 ImGui::SetNextItemWidth(100);
399 if(ImGui::SliderFloat(
"###Time Scale", &time_scale, 0.0f, 1.0f))
401 sim.set_time_scale(time_scale);
403 ImGui::SetItemTooltipEx(
"%s",
"Time scale.");
406 auto vsync = rend.get_vsync();
407 if(ImGui::Checkbox(
"Vsync", &vsync))
409 rend.set_vsync(vsync);
413 ImGui::EndDisabled();
417 ImGui::SetItemTooltipEx(
419 "All compiler errors must be fixed before you can enter Play Mode!");
426 ImGuiWindowFlags header_flags = ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoBringToFrontOnFocus |
427 ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize |
428 ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoDecoration;
429 ImGuiViewport* viewport = ImGui::GetMainViewport();
431 ImGui::SetNextWindowPos(ImVec2(viewport->WorkPos.x, viewport->WorkPos.y));
432 ImGui::SetNextWindowSize(ImVec2(viewport->WorkSize.x, header_size));
433 ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
434 ImGui::PushStyleVar(ImGuiStyleVar_WindowBorderSize, 1.0f);
436 ImGui::SetNextWindowViewport(viewport->ID);
438 bool open = ImGui::Begin(
"HEADER",
nullptr, header_flags);
440 ImGui::PopStyleVar();
441 ImGui::PopStyleVar();
448 ImGui::PushStyleColor(ImGuiCol_ChildBg, ImGui::GetColorU32(ImGuiCol_MenuBarBg));
449 draw_menubar_child(ctx);
451 draw_play_toolbar(ctx, header_size);
452 ImGui::PopStyleColor();
458 draw_about_window(ctx);
463 if (!show_about_window_)
466 if(!ImGui::IsPopupOpen(
"About Unravel Engine"))
468 ImGui::OpenPopup(
"About Unravel Engine");
471 auto viewport = ImGui::GetMainViewport();
472 ImGui::SetNextWindowSize(ImVec2(viewport->WorkSize * 0.30f), ImGuiCond_Always);
473 ImGui::SetNextWindowPos(ImVec2(viewport->WorkSize.x * 0.5f, viewport->WorkSize.y * 0.5f), ImGuiCond_Always, ImVec2(0.5f, 0.5f));
474 if (ImGui::BeginPopupModal(
"About Unravel Engine", &show_about_window_, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize| ImGuiWindowFlags_NoMove))
477 const float title_scale = 1.5f;
479 ImGui::TextColored(ImVec4(0.4f, 0.6f, 1.0f, 1.0f),
"Unravel Engine");
488 "Unravel Engine is a modern, high-performance game engine designed for creating "
489 "interactive 3D and 2D applications. It features a component-based architecture, "
490 "powerful rendering capabilities, and an intuitive editor interface.");
496 const float section_scale = 1.2f;
498 ImGui::Text(
"Key Features");
502 ImGui::BulletText(
"Entity-Component-System");
503 ImGui::BulletText(
"PBR Rendering");
504 ImGui::BulletText(
"C# Scripting");
505 ImGui::BulletText(
"Physics Integration");
507 ImGui::BulletText(
"Real-time Editor");
508 ImGui::BulletText(
"Asset Management");
509 ImGui::BulletText(
"Cross-platform Support");
510 ImGui::BulletText(
"Extensible Architecture");
518 ImGui::Text(
"Build Information");
521 ImGui::Text(
"Build Date: %s", __DATE__);
522 ImGui::Text(
"Build Time: %s", __TIME__);
524 ImGui::Text(
"Configuration: Debug");
526 ImGui::Text(
"Configuration: Release");
534 ImGui::TextColored(ImVec4(0.5f, 0.5f, 0.5f, 1.0f),
535 "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)