Просмотр исходного кода

update to ImGui 1.92.1 and new font system

Jeffery Myers 4 месяцев назад
Родитель
Сommit
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/). 
 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
 # 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.
 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.
 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/DroidSans.ttf", 16.0f);
     //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f);
     //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f);
     //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.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
     // Our state
     bool show_demo_window = true;
     bool show_demo_window = true;

+ 0 - 1
imgui_impl_raylib.h

@@ -45,7 +45,6 @@
 #ifndef IMGUI_DISABLE
 #ifndef IMGUI_DISABLE
 
 
 IMGUI_IMPL_API bool ImGui_ImplRaylib_Init(void);
 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_Shutdown(void);
 IMGUI_IMPL_API void ImGui_ImplRaylib_NewFrame(void);
 IMGUI_IMPL_API void ImGui_ImplRaylib_NewFrame(void);
 IMGUI_IMPL_API void ImGui_ImplRaylib_RenderDrawData(ImDrawData* draw_data);
 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
 struct ImGui_ImplRaylib_Data
 {
 {
-    Texture FontTexture;
 };
 };
 
 
 ImGui_ImplRaylib_Data* ImGui_ImplRaylib_GetBackendData()
 ImGui_ImplRaylib_Data* ImGui_ImplRaylib_GetBackendData()
@@ -77,10 +76,10 @@ ImGui_ImplRaylib_Data* ImGui_ImplRaylib_GetBackendData()
 
 
 void ImGui_ImplRaylib_CreateBackendData()
 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()
 void ImGui_ImplRaylib_FreeBackendData()
@@ -101,31 +100,6 @@ Vector2 GetDisplayScale()
 #endif
 #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*)
 static const char* GetClipTextCallback(ImGuiContext*)
 {
 {
     return GetClipboardText();
     return GetClipboardText();
@@ -139,7 +113,7 @@ static void SetClipTextCallback(ImGuiContext*, const char* text)
 static void ImGuiNewFrame(float deltaTime)
 static void ImGuiNewFrame(float deltaTime)
 {
 {
     ImGuiIO& io = ImGui::GetIO();
     ImGuiIO& io = ImGui::GetIO();
-	auto* platData = ImGui_ImplRaylib_GetBackendData();
+    auto* platData = ImGui_ImplRaylib_GetBackendData();
     if (!platData)
     if (!platData)
     {
     {
         ImGui_ImplRaylib_CreateBackendData();
         ImGui_ImplRaylib_CreateBackendData();
@@ -148,9 +122,6 @@ static void ImGuiNewFrame(float deltaTime)
             return;
             return;
     }
     }
 
 
-    if (!IsTextureValid(platData->FontTexture))
-        ReloadFonts();
-
     Vector2 resolutionScale = GetDisplayScale();
     Vector2 resolutionScale = GetDisplayScale();
 
 
 #ifndef PLATFORM_DRM
 #ifndef PLATFORM_DRM
@@ -313,8 +284,7 @@ void SetupFontAwesome(void)
     if (!IsWindowState(FLAG_WINDOW_HIGHDPI))
     if (!IsWindowState(FLAG_WINDOW_HIGHDPI))
         size *= GetDisplayScale().y;
         size *= GetDisplayScale().y;
 
 
-
-	icons_config.RasterizerMultiply = GetDisplayScale().y;
+    icons_config.RasterizerMultiply = GetDisplayScale().y;
 #endif
 #endif
 
 
     io.Fonts->AddFontFromMemoryCompressedTTF((void*)fa_solid_900_compressed_data, fa_solid_900_compressed_size, size, &icons_config, icons_ranges);
     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();
     ImGuiIO& io = ImGui::GetIO();
     io.BackendPlatformName = "imgui_impl_raylib";
     io.BackendPlatformName = "imgui_impl_raylib";
-    io.BackendFlags |= ImGuiBackendFlags_HasGamepad | ImGuiBackendFlags_HasSetMousePos;
+    io.BackendFlags |= ImGuiBackendFlags_HasGamepad | ImGuiBackendFlags_HasSetMousePos | ImGuiBackendFlags_RendererHasTextures;
 
 
 #ifndef PLATFORM_DRM
 #ifndef PLATFORM_DRM
     io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors;
     io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors;
@@ -488,11 +458,11 @@ void rlImGuiBeginInitImGui(void)
 
 
     ImFontConfig defaultConfig;
     ImFontConfig defaultConfig;
 
 
-	static constexpr int DefaultFonSize = 13;
+    static constexpr int DefaultFonSize = 13;
 
 
     defaultConfig.SizePixels = DefaultFonSize;
     defaultConfig.SizePixels = DefaultFonSize;
 #if !defined(__APPLE__)
 #if !defined(__APPLE__)
-	if (!IsWindowState(FLAG_WINDOW_HIGHDPI))
+    if (!IsWindowState(FLAG_WINDOW_HIGHDPI))
         defaultConfig.SizePixels = ceilf(defaultConfig.SizePixels * GetDisplayScale().y);
         defaultConfig.SizePixels = ceilf(defaultConfig.SizePixels * GetDisplayScale().y);
 
 
     defaultConfig.RasterizerMultiply = GetDisplayScale().y;
     defaultConfig.RasterizerMultiply = GetDisplayScale().y;
@@ -514,13 +484,6 @@ void rlImGuiSetup(bool dark)
     rlImGuiEndInitImGui();
     rlImGuiEndInitImGui();
 }
 }
 
 
-void rlImGuiReloadFonts(void)
-{
-    ImGui::SetCurrentContext(GlobalContext);
-
-    ReloadFonts();
-}
-
 void rlImGuiBegin(void)
 void rlImGuiBegin(void)
 {
 {
     ImGui::SetCurrentContext(GlobalContext);
     ImGui::SetCurrentContext(GlobalContext);
@@ -702,25 +665,25 @@ bool ImGui_ImplRaylib_Init(void)
     return true;
     return true;
 }
 }
 
 
-void ImGui_ImplRaylib_BuildFontAtlas(void)
-{
-    ReloadFonts();
-}
 
 
 void ImGui_ImplRaylib_Shutdown()
 void ImGui_ImplRaylib_Shutdown()
 {
 {
     ImGuiIO& io =ImGui::GetIO();
     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();
     ImGui_ImplRaylib_FreeBackendData();
-
-    io.Fonts->TexID = ImTextureID{0};
 }
 }
 
 
 void ImGui_ImplRaylib_NewFrame(void)
 void ImGui_ImplRaylib_NewFrame(void)
@@ -728,8 +691,69 @@ void ImGui_ImplRaylib_NewFrame(void)
     ImGuiNewFrame(GetFrameTime());
     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)
 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();
     rlDrawRenderBatchActive();
     rlDisableBackfaceCulling();
     rlDisableBackfaceCulling();
 
 

+ 0 - 5
rlImGui.h

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