pikaImgui.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #include <glad/glad.h>
  2. #include <pikaImgui/pikaImgui.h>
  3. #include <GLFW/glfw3.h>
  4. #include "IconsForkAwesome.h"
  5. #include <pikaAllocator/freeListAllocator.h>
  6. #include <logs/assert.h>
  7. #include <compilerIntrinsics.h>
  8. #if !(PIKA_SHOULD_REMOVE_IMGUI)
  9. void *pika::pikaImgui::imguiCustomAlloc(size_t sz, void *user_data)
  10. {
  11. pika::memory::FreeListAllocator *allocator = (pika::memory::FreeListAllocator *)user_data;
  12. PIKA_DEVELOPMENT_ONLY_ASSERT(allocator, "no allocator for imgui");
  13. return allocator->allocate(sz);
  14. }
  15. void pika::pikaImgui::imguiCustomFree(void *ptr, void *user_data)
  16. {
  17. pika::memory::FreeListAllocator *allocator = (pika::memory::FreeListAllocator *)user_data;
  18. PIKA_DEVELOPMENT_ONLY_ASSERT(allocator, "no allocator for imgui");
  19. allocator->free(ptr);
  20. }
  21. void pika::pikaImgui::setImguiAllocator(pika::memory::FreeListAllocator &allocator)
  22. {
  23. ::ImGui::SetAllocatorFunctions(imguiCustomAlloc, imguiCustomFree, &allocator);
  24. }
  25. void pika::pikaImgui::initImgui(PikaContext &pikaContext)
  26. {
  27. setImguiAllocator(pikaContext.imguiAllocator);
  28. auto context = ::ImGui::CreateContext();
  29. //ImGui::StyleColorsDark();
  30. imguiThemes::embraceTheDarkness();
  31. ImGuiIO &io = ::ImGui::GetIO();
  32. io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
  33. //io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
  34. io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // Enable Docking
  35. io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; // Enable Multi-Viewport / Platform Windows
  36. //io.ConfigViewportsNoAutoMerge = true;
  37. //io.ConfigViewportsNoTaskBarIcon = true;
  38. ImGuiStyle &style = ::ImGui::GetStyle();
  39. if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
  40. {
  41. //style.WindowRounding = 0.0f;
  42. style.Colors[ImGuiCol_WindowBg].w = 0.f;
  43. style.Colors[ImGuiCol_DockingEmptyBg].w = 0.f;
  44. }
  45. ImGui_ImplGlfw_InitForOpenGL(pikaContext.wind, true);
  46. ImGui_ImplOpenGL3_Init("#version 330");
  47. pikaContext.ImGuiContext = context;
  48. //https://pixtur.github.io/mkdocs-for-imgui/site/FONTS/
  49. //https://github.com/juliettef/IconFontCppHeaders
  50. //https://fontawesome.com/v4/icons/
  51. io.Fonts->AddFontFromFileTTF(PIKA_RESOURCES_PATH "arial.ttf", 16);
  52. //ImVector<ImWchar> ranges;
  53. //ImFontGlyphRangesBuilder builder;
  54. //builder.AddText("Hello world"); // Add a string (here "Hello world" contains 7 unique characters)
  55. //builder.AddChar(0x7262); // Add a specific character
  56. //builder.AddRanges(io.Fonts->GetGlyphRangesJapanese()); // Add one of the default ranges
  57. //builder.BuildRanges(&ranges);
  58. ImFontConfig config;
  59. config.MergeMode = true;
  60. config.GlyphMinAdvanceX = 16.0f; // Use if you want to make the icon monospaced
  61. static const ImWchar icon_ranges[] = {ICON_MIN_FK, ICON_MAX_FK, 0};
  62. io.Fonts->AddFontFromFileTTF(PIKA_RESOURCES_PATH "fontawesome-webfont.ttf", 16.0f, &config, icon_ranges);
  63. io.Fonts->Build();
  64. }
  65. void pika::pikaImgui::setImguiContext(PikaContext pikaContext)
  66. {
  67. ::ImGui::SetCurrentContext(pikaContext.ImGuiContext);
  68. }
  69. void pika::pikaImgui::imguiStartFrame(PikaContext pikaContext)
  70. {
  71. setImguiContext(pikaContext);
  72. ImGui_ImplOpenGL3_NewFrame();
  73. ImGui_ImplGlfw_NewFrame();
  74. ::ImGui::NewFrame();
  75. ::ImGui::DockSpaceOverViewport(::ImGui::GetMainViewport());
  76. }
  77. void pika::pikaImgui::imguiEndFrame(PikaContext pikaContext)
  78. {
  79. setImguiContext(pikaContext);
  80. ::ImGui::Render();
  81. int display_w = 0, display_h = 0;
  82. glfwGetFramebufferSize(pikaContext.wind, &display_w, &display_h);
  83. glViewport(0, 0, display_w, display_h);
  84. ImGui_ImplOpenGL3_RenderDrawData(::ImGui::GetDrawData());
  85. ImGuiIO &io = ::ImGui::GetIO();
  86. // Update and Render additional Platform Windows
  87. // (Platform functions may change the current OpenGL context, so we save/restore it to make it easier to paste this code elsewhere.
  88. // For this specific demo app we could also call glfwMakeContextCurrent(window) directly)
  89. if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
  90. {
  91. //GLFWwindow *backup_current_context = glfwGetCurrentContext();
  92. //ImGui::UpdatePlatformWindows();
  93. //ImGui::RenderPlatformWindowsDefault();
  94. //glfwMakeContextCurrent(backup_current_context);
  95. ::ImGui::UpdatePlatformWindows();
  96. ::ImGui::RenderPlatformWindowsDefault();
  97. pikaContext.glfwMakeContextCurrentPtr(pikaContext.wind); //idea create a class with some functions
  98. }
  99. }
  100. void pika::pikaImgui::addErrorSymbol()
  101. {
  102. ::ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(255, 0, 0, 255));
  103. ::ImGui::Text(ICON_FK_TIMES_CIRCLE " ");
  104. ::ImGui::PopStyleColor();
  105. }
  106. void pika::pikaImgui::addWarningSymbol()
  107. {
  108. ::ImGui::PushStyleColor(ImGuiCol_Text, IM_COL32(255, 255, 0, 255));
  109. ::ImGui::Text(ICON_FK_EXCLAMATION_TRIANGLE " ");
  110. ::ImGui::PopStyleColor();
  111. }
  112. void pika::pikaImgui::helpMarker(const char *desc)
  113. {
  114. ::ImGui::TextDisabled("(?)");
  115. if (::ImGui::IsItemHovered())
  116. {
  117. ::ImGui::BeginTooltip();
  118. ::ImGui::PushTextWrapPos(::ImGui::GetFontSize() * 35.0f);
  119. ::ImGui::TextUnformatted(desc);
  120. ::ImGui::PopTextWrapPos();
  121. ::ImGui::EndTooltip();
  122. }
  123. }
  124. //https://github.com/ocornut/imgui/discussions/3862
  125. void pika::pikaImgui::alignForWidth(float width, float alignment)
  126. {
  127. ImGuiStyle &style = ::ImGui::GetStyle();
  128. float avail = ::ImGui::GetContentRegionAvail().x;
  129. float off = (avail - width) * alignment;
  130. if (off > 0.0f)
  131. ::ImGui::SetCursorPosX(::ImGui::GetCursorPosX() + off);
  132. }
  133. static int sizesType = 0;
  134. void pika::pikaImgui::displayMemorySizeValue(size_t value)
  135. {
  136. switch (sizesType)
  137. {
  138. case 0:
  139. ImGui::Text("%" IM_PRIu64 " (bytes)", value);
  140. break;
  141. case 1:
  142. ImGui::Text("%f (KB)", pika::BYTES_TO_KB(value));
  143. break;
  144. case 2:
  145. ImGui::Text("%f (MB)", pika::BYTES_TO_MB(value));
  146. break;
  147. case 3:
  148. ImGui::Text("%f (GB)", pika::BYTES_TO_GB(value));
  149. break;
  150. default:
  151. PIKA_UNREACHABLE();
  152. }
  153. //ImGui::Text("%" IM_PRIu64 " (bytes)", value);
  154. }
  155. void pika::pikaImgui::displayMemorySizeToggle()
  156. {
  157. ImGui::Combo("Sizes type##pika", &sizesType, "Bytes\0KB\0MB\0GB\0");
  158. }
  159. #else
  160. void pika::pikaImgui::alignForWidth(float width, float alignment) {};
  161. void pika::pikaImgui::helpMarker(const char *desc) {};
  162. void pika::pikaImgui::addWarningSymbol() {};
  163. void pika::pikaImgui::addErrorSymbol() {};
  164. void pika::pikaImgui::imguiEndFrame(PikaContext pikaContext) {};
  165. void pika::pikaImgui::imguiStartFrame(PikaContext pikaContext) {};
  166. void pika::pikaImgui::setImguiContext(PikaContext pikaContext) {};
  167. void pika::pikaImgui::initImgui(PikaContext &pikaContext) {};
  168. void pika::pikaImgui::setImguiAllocator(pika::memory::FreeListAllocator &allocator) {};
  169. #endif