فهرست منبع

update to ImGui 1.92.1 and new font system

Jeffery Myers 1 هفته پیش
والد
کامیت
dc7479b78a
5فایلهای تغییر یافته به همراه84 افزوده شده و 63 حذف شده
  1. 3 0
      README.md
  2. 2 2
      examples/imgui_style_example.cpp
  3. 0 1
      imgui_impl_raylib.h
  4. 79 55
      rlImGui.cpp
  5. 0 5
      rlImGui.h

+ 3 - 0
README.md

@@ -4,6 +4,9 @@ A Raylib integration with DearImGui
 
 rlImgui provides a backend for [Dear ImGui](https://github.com/ocornut/imgui) using [Raylib](https://www.raylib.com/). 
 
+# ImGui Version
+This version was built against ImGui 1.92.1 and uses the new Font API. It is incompatbile with older versions of Dear ImGui.
+
 # Building
 The rlImGui repository itself is set up to use Premake to generate a static library and examples for Visual Studio 2019. Premake can also be used to generate makefiles for Linux. rlImGui can be used as a static library, or by directly including the files into your game project.
 Premake is not required to use rlImGui, it is simply just what is used for development.

+ 2 - 2
examples/imgui_style_example.cpp

@@ -82,8 +82,8 @@ int main(int, char**)
     //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f);
     //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f);
     //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f);
-    ImFont* font = io.Fonts->AddFontFromFileTTF("resources/driusstraight.ttf", ScaleToDPIF(18.0f), nullptr, io.Fonts->GetGlyphRangesJapanese());
-    IM_ASSERT(font != nullptr);
+   //  ImFont* font = io.Fonts->AddFontFromFileTTF("resources/driusstraight.ttf", ScaleToDPIF(18.0f), nullptr, io.Fonts->GetGlyphRangesJapanese());
+    // IM_ASSERT(font != nullptr);
    
     // Our state
     bool show_demo_window = true;

+ 0 - 1
imgui_impl_raylib.h

@@ -45,7 +45,6 @@
 #ifndef IMGUI_DISABLE
 
 IMGUI_IMPL_API bool ImGui_ImplRaylib_Init(void);
-IMGUI_IMPL_API void ImGui_ImplRaylib_BuildFontAtlas(void);
 IMGUI_IMPL_API void ImGui_ImplRaylib_Shutdown(void);
 IMGUI_IMPL_API void ImGui_ImplRaylib_NewFrame(void);
 IMGUI_IMPL_API void ImGui_ImplRaylib_RenderDrawData(ImDrawData* draw_data);

+ 79 - 55
rlImGui.cpp

@@ -67,7 +67,6 @@ bool rlImGuiIsSuperDown() { return IsKeyDown(KEY_RIGHT_SUPER) || IsKeyDown(KEY_L
 
 struct ImGui_ImplRaylib_Data
 {
-    Texture FontTexture;
 };
 
 ImGui_ImplRaylib_Data* ImGui_ImplRaylib_GetBackendData()
@@ -77,10 +76,10 @@ ImGui_ImplRaylib_Data* ImGui_ImplRaylib_GetBackendData()
 
 void ImGui_ImplRaylib_CreateBackendData()
 {
-	if (!ImGui::GetCurrentContext() || ImGui::GetPlatformIO().Renderer_RenderState)
-		return;
+    if (!ImGui::GetCurrentContext() || ImGui::GetPlatformIO().Renderer_RenderState)
+        return;
 
-	ImGui::GetPlatformIO().Renderer_RenderState = MemAlloc(sizeof(ImGui_ImplRaylib_Data));
+    ImGui::GetPlatformIO().Renderer_RenderState = MemAlloc(sizeof(ImGui_ImplRaylib_Data));
 }
 
 void ImGui_ImplRaylib_FreeBackendData()
@@ -101,31 +100,6 @@ Vector2 GetDisplayScale()
 #endif
 }
 
-void ReloadFonts(void)
-{
-    auto* platData = ImGui_ImplRaylib_GetBackendData();
-    if (!platData)
-        return;
-
-    ImGuiPlatformIO& platIo = ImGui::GetPlatformIO();
-    ImGuiIO& io = ImGui::GetIO();
-    unsigned char* pixels = nullptr;
-
-    int width;
-    int height;
-    io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height, nullptr);
-    Image image = GenImageColor(width, height, BLANK);
-    memcpy(image.data, pixels, width * height * 4);
-
-    if (IsTextureValid(platData->FontTexture))
-    {
-        UnloadTexture(platData->FontTexture);
-    }
-    platData->FontTexture = LoadTextureFromImage(image);
-    UnloadImage(image);
-    io.Fonts->TexID = static_cast<ImTextureID>(platData->FontTexture.id);
-}
-
 static const char* GetClipTextCallback(ImGuiContext*)
 {
     return GetClipboardText();
@@ -139,7 +113,7 @@ static void SetClipTextCallback(ImGuiContext*, const char* text)
 static void ImGuiNewFrame(float deltaTime)
 {
     ImGuiIO& io = ImGui::GetIO();
-	auto* platData = ImGui_ImplRaylib_GetBackendData();
+    auto* platData = ImGui_ImplRaylib_GetBackendData();
     if (!platData)
     {
         ImGui_ImplRaylib_CreateBackendData();
@@ -148,9 +122,6 @@ static void ImGuiNewFrame(float deltaTime)
             return;
     }
 
-    if (!IsTextureValid(platData->FontTexture))
-        ReloadFonts();
-
     Vector2 resolutionScale = GetDisplayScale();
 
 #ifndef PLATFORM_DRM
@@ -313,8 +284,7 @@ void SetupFontAwesome(void)
     if (!IsWindowState(FLAG_WINDOW_HIGHDPI))
         size *= GetDisplayScale().y;
 
-
-	icons_config.RasterizerMultiply = GetDisplayScale().y;
+    icons_config.RasterizerMultiply = GetDisplayScale().y;
 #endif
 
     io.Fonts->AddFontFromMemoryCompressedTTF((void*)fa_solid_900_compressed_data, fa_solid_900_compressed_size, size, &icons_config, icons_ranges);
@@ -326,7 +296,7 @@ void SetupBackend(void)
 {
     ImGuiIO& io = ImGui::GetIO();
     io.BackendPlatformName = "imgui_impl_raylib";
-    io.BackendFlags |= ImGuiBackendFlags_HasGamepad | ImGuiBackendFlags_HasSetMousePos;
+    io.BackendFlags |= ImGuiBackendFlags_HasGamepad | ImGuiBackendFlags_HasSetMousePos | ImGuiBackendFlags_RendererHasTextures;
 
 #ifndef PLATFORM_DRM
     io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors;
@@ -488,11 +458,11 @@ void rlImGuiBeginInitImGui(void)
 
     ImFontConfig defaultConfig;
 
-	static constexpr int DefaultFonSize = 13;
+    static constexpr int DefaultFonSize = 13;
 
     defaultConfig.SizePixels = DefaultFonSize;
 #if !defined(__APPLE__)
-	if (!IsWindowState(FLAG_WINDOW_HIGHDPI))
+    if (!IsWindowState(FLAG_WINDOW_HIGHDPI))
         defaultConfig.SizePixels = ceilf(defaultConfig.SizePixels * GetDisplayScale().y);
 
     defaultConfig.RasterizerMultiply = GetDisplayScale().y;
@@ -514,13 +484,6 @@ void rlImGuiSetup(bool dark)
     rlImGuiEndInitImGui();
 }
 
-void rlImGuiReloadFonts(void)
-{
-    ImGui::SetCurrentContext(GlobalContext);
-
-    ReloadFonts();
-}
-
 void rlImGuiBegin(void)
 {
     ImGui::SetCurrentContext(GlobalContext);
@@ -702,25 +665,25 @@ bool ImGui_ImplRaylib_Init(void)
     return true;
 }
 
-void ImGui_ImplRaylib_BuildFontAtlas(void)
-{
-    ReloadFonts();
-}
 
 void ImGui_ImplRaylib_Shutdown()
 {
     ImGuiIO& io =ImGui::GetIO();
 
-    auto* plat = ImGui_ImplRaylib_GetBackendData();
-
-    if (plat && IsTextureValid(plat->FontTexture))
+    for (auto& texture : ImGui::GetPlatformIO().Textures)
     {
-        UnloadTexture(plat->FontTexture);
+        if (texture->Status != ImTextureStatus_Destroyed)
+        {
+            Texture* backendData = (Texture*)texture->BackendUserData;
+            if (backendData && IsTextureValid(*backendData))
+            {
+                UnloadTexture(*backendData);
+            }
+            texture->Status = ImTextureStatus_Destroyed;
+        }
     }
 
     ImGui_ImplRaylib_FreeBackendData();
-
-    io.Fonts->TexID = ImTextureID{0};
 }
 
 void ImGui_ImplRaylib_NewFrame(void)
@@ -728,8 +691,69 @@ void ImGui_ImplRaylib_NewFrame(void)
     ImGuiNewFrame(GetFrameTime());
 }
 
+void ImGui_ImplRaylib_UpdateTexture(ImTextureData* tex)
+{
+    switch (tex->Status)
+    {
+        case ImTextureStatus_OK:
+        case ImTextureStatus_Destroyed:
+        default:
+            break;
+
+        case ImTextureStatus_WantCreate:
+        {
+            Image img = { 0 };
+            img.width = tex->Width;
+            img.height = tex->Height;
+
+            img.format = tex->Format == ImTextureFormat_Alpha8 ? PIXELFORMAT_UNCOMPRESSED_GRAYSCALE : PIXELFORMAT_UNCOMPRESSED_R8G8B8A8;
+            img.mipmaps = 1;
+            img.data = tex->GetPixels();
+
+            Texture* texture = (Texture*)MemAlloc(sizeof(Texture));
+            tex->BackendUserData = texture;;
+            *texture = LoadTextureFromImage(img);
+            tex->SetTexID(ImTextureID(texture->id));
+            tex->Status = ImTextureStatus_OK;
+        }
+            break;
+
+        case ImTextureStatus_WantUpdates:
+        {
+            Texture* texture = (Texture*)tex->BackendUserData;
+            if (!texture)
+                break;
+
+            UpdateTexture(*texture, tex->GetPixels());
+
+            tex->Status = ImTextureStatus_OK;
+        }
+            break;
+
+        case ImTextureStatus_WantDestroy:
+        {
+            Texture* texture = (Texture*)tex->BackendUserData;
+
+            if (!texture)
+                break;
+            UnloadTexture(*texture);
+            tex->Status = ImTextureStatus_Destroyed;
+        }
+        break;
+    }
+}
+
 void ImGui_ImplRaylib_RenderDrawData(ImDrawData* draw_data)
 {
+    if (draw_data->Textures != nullptr)
+    {
+        for (ImTextureData* tex : *draw_data->Textures)
+        {
+            if (tex->Status != ImTextureStatus_OK)
+                ImGui_ImplRaylib_UpdateTexture(tex);
+        }
+    }
+
     rlDrawRenderBatchActive();
     rlDisableBackfaceCulling();
 

+ 0 - 5
rlImGui.h

@@ -110,11 +110,6 @@ RLIMGUIAPI void rlImGuiBeginInitImGui(void);
 /// </summary>
 RLIMGUIAPI void rlImGuiEndInitImGui(void);
 
-/// <summary>
-/// Forces the font texture atlas to be recomputed and re-cached
-/// </summary>
-RLIMGUIAPI void rlImGuiReloadFonts(void);
-
 // Advanced Update API
 
 /// <summary>