mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 13:11:05 +01:00 
			
		
		
		
	Merge branch 'master' into docking
# Conflicts: # examples/imgui_impl_opengl3.cpp # imgui_widgets.cpp
This commit is contained in:
		
							
								
								
									
										2
									
								
								.github/issue_template.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/issue_template.md
									
									
									
									
										vendored
									
									
								
							| @@ -4,7 +4,7 @@ | ||||
|  | ||||
| 2. PLEASE CAREFULLY READ: https://github.com/ocornut/imgui/issues/2261 | ||||
|  | ||||
| 2. FOR FIRST-TIME USERS ISSUES COMPILING/LINKING/RUNNING/LOADING FONTS,  please use the [Discord server](https://discord.gg/NgJ4SEP) or [Discourse forum](https://discourse.dearimgui.org/c/getting-started). | ||||
| 2. FOR FIRST-TIME USERS ISSUES COMPILING/LINKING/RUNNING/LOADING FONTS,  please use the [Discord server](http://discord.dearimgui.org). | ||||
|  | ||||
| 3. PLEASE MAKE SURE that you have: read the FAQ; explored the contents of `ShowDemoWindow()` including the Examples menu; searched among Issues; used your IDE to search for keywords in all sources and text files; and read the link provided in (1) (2). | ||||
|  | ||||
|   | ||||
| @@ -142,6 +142,8 @@ Other Changes: | ||||
| - Demo: Added simple item reordering demo in Widgets -> Drag and Drop section. (#2823, #143) [@rokups] | ||||
| - Examples: DX12: Using IDXGIDebug1::ReportLiveObjects() when DX12_ENABLE_DEBUG_LAYER is enabled. | ||||
| - Examples: Emscripten: Removed NO_FILESYSTEM from Makefile, seems to fail on some setup. (#2734) [@Funto] | ||||
| - Backends: OpenGL3: Fix building with pre-3.2 GL loaders which do not expose glDrawElementsBaseVertex(), | ||||
|   using runtime GL version to decide if we set ImGuiBackendFlags_RendererHasVtxOffset. (#2866, #2852) [@dpilawa] | ||||
| - Backends: OSX: Fix using Backspace key. (#2578, #2817, #2818) [@DiligentGraphics] | ||||
| - Backends: GLFW: Previously installed user callbacks are now restored on shutdown. (#2836) [@malte-v] | ||||
| - CI: Set up a bunch of continuous-integration tests using GitHub Actions. We now compile many of the example | ||||
|   | ||||
| @@ -155,7 +155,7 @@ See: [Wiki](https://github.com/ocornut/imgui/wiki) for many links, references, a | ||||
|  | ||||
| See: [Articles about the IMGUI paradigm](https://github.com/ocornut/imgui/wiki#Articles-about-the-IMGUI-paradigm) to read/learn about the Immediate Mode GUI paradigm. | ||||
|  | ||||
| If you are new to Dear ImGui and have issues with: compiling, linking, adding fonts, wiring inputs, running or displaying Dear ImGui: you can use [Discord server](https://discord.gg/NgJ4SEP) or [Discourse forums](https://discourse.dearimgui.org). | ||||
| If you are new to Dear ImGui and have issues with: compiling, linking, adding fonts, wiring inputs, running or displaying Dear ImGui: you can use [Discord server](http://discord.dearimgui.org). | ||||
|  | ||||
| Otherwise, for any other questions, bug reports, requests, feedback, you may post on https://github.com/ocornut/imgui/issues. Please read and fill the New Issue template carefully. | ||||
|  | ||||
| @@ -176,7 +176,7 @@ How to help | ||||
|  | ||||
| **How can I help?** | ||||
|  | ||||
| - You may participate in the [Discord server](https://discord.gg/NgJ4SEP), [Discourse forums](https://discourse.dearimgui.org), GitHub [issues tracker](https://github.com/ocornut/imgui/issues). | ||||
| - You may participate in the [Discord server](http://discord.dearimgui.org), [GitHub forum/issues](https://github.com/ocornut/imgui/issues). | ||||
| - You may help with development and submit pull requests! Please understand that by submitting a PR you are also submitting a request for the maintainer to review your code and then take over its maintenance forever. PR should be crafted both in the interest in the end-users and also to ease the maintainer into understanding and accepting it. | ||||
| - See [Help wanted](https://github.com/ocornut/imgui/wiki/Help-Wanted) on the [Wiki](https://github.com/ocornut/imgui/wiki/) for some more ideas. | ||||
| - Have your company financially support this project. | ||||
|   | ||||
| @@ -15,6 +15,7 @@ | ||||
| // CHANGELOG | ||||
| // (minor and older changes stripped away, please see git history for details) | ||||
| //  2019-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface. | ||||
| //  2019-10-25: OpenGL: Using a combination of GL define and runtime GL version to decide whether to use glDrawElementsBaseVertex(). Fix building with pre-3.2 GL loaders. | ||||
| //  2019-09-22: OpenGL: Detect default GL loader using __has_include compiler facility. | ||||
| //  2019-09-16: OpenGL: Tweak initialization code to allow application calling ImGui_ImplOpenGL3_CreateFontsTexture() before the first NewFrame() call. | ||||
| //  2019-05-29: OpenGL: Desktop GL only: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag. | ||||
| @@ -79,7 +80,7 @@ | ||||
| #include "TargetConditionals.h" | ||||
| #endif | ||||
|  | ||||
| // Auto-detect GL version | ||||
| // Auto-enable GLES on matching platforms | ||||
| #if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) | ||||
| #if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV)) || (defined(__ANDROID__)) | ||||
| #define IMGUI_IMPL_OPENGL_ES3           // iOS, Android  -> GL ES 3, "#version 300 es" | ||||
| @@ -101,9 +102,9 @@ | ||||
| #include <GLES2/gl2.h> | ||||
| #elif defined(IMGUI_IMPL_OPENGL_ES3) | ||||
| #if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV)) | ||||
| #include <OpenGLES/ES3/gl.h>  // Use GL ES 3 | ||||
| #include <OpenGLES/ES3/gl.h>    // Use GL ES 3 | ||||
| #else | ||||
| #include <GLES3/gl3.h>  // Use GL ES 3 | ||||
| #include <GLES3/gl3.h>          // Use GL ES 3 | ||||
| #endif | ||||
| #else | ||||
| // About Desktop OpenGL function loaders: | ||||
| @@ -121,15 +122,16 @@ | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| // Desktop GL has glDrawElementsBaseVertex() which GL ES and WebGL don't have. | ||||
| #if defined(IMGUI_IMPL_OPENGL_ES2) || defined(IMGUI_IMPL_OPENGL_ES3) | ||||
| #define IMGUI_IMPL_OPENGL_HAS_DRAW_WITH_BASE_VERTEX     0 | ||||
| // Desktop GL 3.2+ has glDrawElementsBaseVertex() which GL ES and WebGL don't have. | ||||
| #if defined(IMGUI_IMPL_OPENGL_ES2) || defined(IMGUI_IMPL_OPENGL_ES3) || !defined(GL_VERSION_3_2) | ||||
| #define IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET   0 | ||||
| #else | ||||
| #define IMGUI_IMPL_OPENGL_HAS_DRAW_WITH_BASE_VERTEX     1 | ||||
| #define IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET   1 | ||||
| #endif | ||||
|  | ||||
| // OpenGL Data | ||||
| static char         g_GlslVersionString[32] = ""; | ||||
| static GLuint       g_GlVersion = 0;                // Extracted at runtime using GL_MAJOR_VERSION, GL_MINOR_VERSION queries. | ||||
| static char         g_GlslVersionString[32] = "";   // Specified by user or detected based on compile time GL settings. | ||||
| static GLuint       g_FontTexture = 0; | ||||
| static GLuint       g_ShaderHandle = 0, g_VertHandle = 0, g_FragHandle = 0; | ||||
| static int          g_AttribLocationTex = 0, g_AttribLocationProjMtx = 0;                                // Uniforms location | ||||
| @@ -143,15 +145,27 @@ static void ImGui_ImplOpenGL3_ShutdownPlatformInterface(); | ||||
| // Functions | ||||
| bool    ImGui_ImplOpenGL3_Init(const char* glsl_version) | ||||
| { | ||||
|     // Query for GL version | ||||
| #if !defined(IMGUI_IMPL_OPENGL_ES2) | ||||
|     GLint major, minor; | ||||
|     glGetIntegerv(GL_MAJOR_VERSION, &major); | ||||
|     glGetIntegerv(GL_MINOR_VERSION, &minor); | ||||
|     g_GlVersion = major * 1000 + minor; | ||||
| #else | ||||
|     g_GlVersion = 2000; // GLES 2 | ||||
| #endif | ||||
|  | ||||
|     // Setup back-end capabilities flags | ||||
|     ImGuiIO& io = ImGui::GetIO(); | ||||
|     io.BackendRendererName = "imgui_impl_opengl3"; | ||||
| #if IMGUI_IMPL_OPENGL_HAS_DRAW_WITH_BASE_VERTEX | ||||
|     io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset;  // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes. | ||||
| #if IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET | ||||
|     if (g_GlVersion >= 3200) | ||||
|         io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset;  // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes. | ||||
| #endif | ||||
|     io.BackendFlags |= ImGuiBackendFlags_RendererHasViewports;  // We can create multi-viewports on the Renderer side (optional) | ||||
|  | ||||
|     // Store GLSL version string so we can refer to it later in case we recreate shaders. Note: GLSL version is NOT the same as GL version. Leave this to NULL if unsure. | ||||
|     // Store GLSL version string so we can refer to it later in case we recreate shaders.  | ||||
|     // Note: GLSL version is NOT the same as GL version. Leave this to NULL if unsure. | ||||
| #if defined(IMGUI_IMPL_OPENGL_ES2) | ||||
|     if (glsl_version == NULL) | ||||
|         glsl_version = "#version 100"; | ||||
| @@ -355,11 +369,12 @@ void    ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data) | ||||
|  | ||||
|                     // Bind texture, Draw | ||||
|                     glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->TextureId); | ||||
| #if IMGUI_IMPL_OPENGL_HAS_DRAW_WITH_BASE_VERTEX | ||||
|                     glDrawElementsBaseVertex(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)), (GLint)pcmd->VtxOffset); | ||||
| #else | ||||
|                     glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx))); | ||||
| #if IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET | ||||
|                     if (g_GlVersion >= 3200) | ||||
|                         glDrawElementsBaseVertex(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)), (GLint)pcmd->VtxOffset); | ||||
|                     else | ||||
| #endif | ||||
|                     glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx))); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|   | ||||
							
								
								
									
										12
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ | ||||
| // Newcomers, read 'Programmer guide' below for notes on how to setup Dear ImGui in your codebase. | ||||
| // Get latest version at https://github.com/ocornut/imgui | ||||
| // Releases change-log at https://github.com/ocornut/imgui/releases | ||||
| // Technical Support for Getting Started https://discourse.dearimgui.org/c/getting-started | ||||
| // Technical Support for Getting Started https://github.com/ocornut/imgui/wiki | ||||
| // Gallery (please post your screenshots/video there!): https://github.com/ocornut/imgui/issues/2847 | ||||
|  | ||||
| // Developed by Omar Cornut and every direct or indirect contributors to the GitHub. | ||||
| @@ -5134,8 +5134,8 @@ static ImVec2 CalcWindowSizeAfterConstraint(ImGuiWindow* window, ImVec2 new_size | ||||
|             g.NextWindowData.SizeCallback(&data); | ||||
|             new_size = data.DesiredSize; | ||||
|         } | ||||
|         new_size.x = ImFloor(new_size.x); | ||||
|         new_size.y = ImFloor(new_size.y); | ||||
|         new_size.x = IM_FLOOR(new_size.x); | ||||
|         new_size.y = IM_FLOOR(new_size.y); | ||||
|     } | ||||
|  | ||||
|     // Minimum size | ||||
| @@ -7139,7 +7139,7 @@ void ImGui::SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond con | ||||
|     if (size.x > 0.0f) | ||||
|     { | ||||
|         window->AutoFitFramesX = 0; | ||||
|         window->SizeFull.x = ImFloor(size.x); | ||||
|         window->SizeFull.x = IM_FLOOR(size.x); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
| @@ -7149,7 +7149,7 @@ void ImGui::SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond con | ||||
|     if (size.y > 0.0f) | ||||
|     { | ||||
|         window->AutoFitFramesY = 0; | ||||
|         window->SizeFull.y = ImFloor(size.y); | ||||
|         window->SizeFull.y = IM_FLOOR(size.y); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
| @@ -9021,7 +9021,7 @@ static void ImGui::NavUpdate() | ||||
|     { | ||||
|         // *Fallback* manual-scroll with Nav directional keys when window has no navigable item | ||||
|         ImGuiWindow* window = g.NavWindow; | ||||
|         const float scroll_speed = ImFloor(window->CalcFontSize() * 100 * g.IO.DeltaTime + 0.5f); // We need round the scrolling speed because sub-pixel scroll isn't reliably supported. | ||||
|         const float scroll_speed = IM_ROUND(window->CalcFontSize() * 100 * g.IO.DeltaTime); // We need round the scrolling speed because sub-pixel scroll isn't reliably supported. | ||||
|         if (window->DC.NavLayerActiveMask == 0x00 && window->DC.NavHasScroll && g.NavMoveRequest) | ||||
|         { | ||||
|             if (g.NavMoveDir == ImGuiDir_Left || g.NavMoveDir == ImGuiDir_Right) | ||||
|   | ||||
							
								
								
									
										8
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -1724,11 +1724,11 @@ struct ImGuiTextBuffer | ||||
|     IMGUI_API static char EmptyString[1]; | ||||
|  | ||||
|     ImGuiTextBuffer()   { } | ||||
|     inline char         operator[](int i)       { IM_ASSERT(Buf.Data != NULL); return Buf.Data[i]; } | ||||
|     inline char         operator[](int i) const { IM_ASSERT(Buf.Data != NULL); return Buf.Data[i]; } | ||||
|     const char*         begin() const           { return Buf.Data ? &Buf.front() : EmptyString; } | ||||
|     const char*         end() const             { return Buf.Data ? &Buf.back() : EmptyString; }   // Buf is zero-terminated, so end() will point on the zero-terminator | ||||
|     int                 size() const            { return Buf.Size ? Buf.Size - 1 : 0; } | ||||
|     bool                empty()                 { return Buf.Size <= 1; } | ||||
|     bool                empty() const           { return Buf.Size <= 1; } | ||||
|     void                clear()                 { Buf.clear(); } | ||||
|     void                reserve(int capacity)   { Buf.reserve(capacity); } | ||||
|     const char*         c_str() const           { return Buf.Data ? Buf.Data : EmptyString; } | ||||
| @@ -2206,7 +2206,7 @@ struct ImFontAtlas | ||||
|     IMGUI_API bool              Build();                    // Build pixels data. This is called automatically for you by the GetTexData*** functions. | ||||
|     IMGUI_API void              GetTexDataAsAlpha8(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL);  // 1 byte per-pixel | ||||
|     IMGUI_API void              GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL);  // 4 bytes-per-pixel | ||||
|     bool                        IsBuilt()                   { return Fonts.Size > 0 && (TexPixelsAlpha8 != NULL || TexPixelsRGBA32 != NULL); } | ||||
|     bool                        IsBuilt() const             { return Fonts.Size > 0 && (TexPixelsAlpha8 != NULL || TexPixelsRGBA32 != NULL); } | ||||
|     void                        SetTexID(ImTextureID id)    { TexID = id; } | ||||
|  | ||||
|     //------------------------------------------- | ||||
| @@ -2239,7 +2239,7 @@ struct ImFontAtlas | ||||
|     const ImFontAtlasCustomRect*GetCustomRectByIndex(int index) const { if (index < 0) return NULL; return &CustomRects[index]; } | ||||
|  | ||||
|     // [Internal] | ||||
|     IMGUI_API void              CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max); | ||||
|     IMGUI_API void              CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) const; | ||||
|     IMGUI_API bool              GetMouseCursorTexData(ImGuiMouseCursor cursor, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]); | ||||
|  | ||||
|     //------------------------------------------- | ||||
|   | ||||
| @@ -101,12 +101,17 @@ Index of this file: | ||||
| // Play it nice with Windows users. Notepad in 2017 still doesn't display text data with Unix-style \n. | ||||
| #ifdef _WIN32 | ||||
| #define IM_NEWLINE  "\r\n" | ||||
| #define snprintf    _snprintf | ||||
| #define vsnprintf   _vsnprintf | ||||
| #else | ||||
| #define IM_NEWLINE  "\n" | ||||
| #endif | ||||
|  | ||||
| #if defined(_MSC_VER) && !defined(snprintf) | ||||
| #define snprintf    _snprintf | ||||
| #endif | ||||
| #if defined(_MSC_VER) && !defined(vsnprintf) | ||||
| #define vsnprintf   _vsnprintf | ||||
| #endif | ||||
|  | ||||
| //----------------------------------------------------------------------------- | ||||
| // [SECTION] Forward Declarations, Helpers | ||||
| //----------------------------------------------------------------------------- | ||||
|   | ||||
| @@ -1758,7 +1758,7 @@ int ImFontAtlas::AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int | ||||
|     return CustomRects.Size - 1; // Return index | ||||
| } | ||||
|  | ||||
| void ImFontAtlas::CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) | ||||
| void ImFontAtlas::CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) const | ||||
| { | ||||
|     IM_ASSERT(TexWidth > 0 && TexHeight > 0);   // Font atlas needs to be built before we can calculate UV coordinates | ||||
|     IM_ASSERT(rect->IsPacked());                // Make sure the rectangle has been packed | ||||
| @@ -2075,7 +2075,7 @@ bool    ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) | ||||
|         const float descent = ImFloor(unscaled_descent * font_scale + ((unscaled_descent > 0.0f) ? +1 : -1)); | ||||
|         ImFontAtlasBuildSetupFont(atlas, dst_font, &cfg, ascent, descent); | ||||
|         const float font_off_x = cfg.GlyphOffset.x; | ||||
|         const float font_off_y = cfg.GlyphOffset.y + ImFloor(dst_font->Ascent + 0.5f); | ||||
|         const float font_off_y = cfg.GlyphOffset.y + IM_ROUND(dst_font->Ascent); | ||||
|  | ||||
|         for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++) | ||||
|         { | ||||
| @@ -2597,7 +2597,7 @@ void ImFont::AddGlyph(ImWchar codepoint, float x0, float y0, float x1, float y1, | ||||
|     glyph.AdvanceX = advance_x + ConfigData->GlyphExtraSpacing.x;  // Bake spacing into AdvanceX | ||||
|  | ||||
|     if (ConfigData->PixelSnapH) | ||||
|         glyph.AdvanceX = IM_FLOOR(glyph.AdvanceX + 0.5f); | ||||
|         glyph.AdvanceX = IM_ROUND(glyph.AdvanceX); | ||||
|  | ||||
|     // Compute rough surface usage metrics (+1 to account for average padding, +0.99 to round) | ||||
|     DirtyLookupTables = true; | ||||
| @@ -3235,9 +3235,9 @@ static unsigned int stb_adler32(unsigned int adler32, unsigned char *buffer, uns | ||||
| { | ||||
|     const unsigned long ADLER_MOD = 65521; | ||||
|     unsigned long s1 = adler32 & 0xffff, s2 = adler32 >> 16; | ||||
|     unsigned long blocklen, i; | ||||
|     unsigned long blocklen = buflen % 5552; | ||||
|  | ||||
|     blocklen = buflen % 5552; | ||||
|     unsigned long i; | ||||
|     while (buflen) { | ||||
|         for (i=0; i + 7 < blocklen; i += 8) { | ||||
|             s1 += buffer[0], s2 += s1; | ||||
| @@ -3264,10 +3264,9 @@ static unsigned int stb_adler32(unsigned int adler32, unsigned char *buffer, uns | ||||
|  | ||||
| static unsigned int stb_decompress(unsigned char *output, const unsigned char *i, unsigned int /*length*/) | ||||
| { | ||||
|     unsigned int olen; | ||||
|     if (stb__in4(0) != 0x57bC0000) return 0; | ||||
|     if (stb__in4(4) != 0)          return 0; // error! stream is > 4GB | ||||
|     olen = stb_decompress_length(i); | ||||
|     const unsigned int olen = stb_decompress_length(i); | ||||
|     stb__barrier_in_b = i; | ||||
|     stb__barrier_out_e = output + olen; | ||||
|     stb__barrier_out_b = output; | ||||
|   | ||||
| @@ -152,6 +152,7 @@ extern IMGUI_API ImGuiContext* GImGui;  // Current implicit context pointer | ||||
| #define IM_F32_TO_INT8_UNBOUND(_VAL)    ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f)))   // Unsaturated, for display purpose | ||||
| #define IM_F32_TO_INT8_SAT(_VAL)        ((int)(ImSaturate(_VAL) * 255.0f + 0.5f))               // Saturated, always output 0..255 | ||||
| #define IM_FLOOR(_VAL)                  ((float)(int)(_VAL))                                    // ImFloor() is not inlined in MSVC debug builds | ||||
| #define IM_ROUND(_VAL)                  ((float)(int)((_VAL) + 0.5f))                           // | ||||
|  | ||||
| // Debug Logging | ||||
| #ifndef IMGUI_DEBUG_LOG | ||||
| @@ -274,8 +275,8 @@ static inline float  ImSaturate(float f) | ||||
| static inline float  ImLengthSqr(const ImVec2& lhs)                             { return lhs.x*lhs.x + lhs.y*lhs.y; } | ||||
| static inline float  ImLengthSqr(const ImVec4& lhs)                             { return lhs.x*lhs.x + lhs.y*lhs.y + lhs.z*lhs.z + lhs.w*lhs.w; } | ||||
| static inline float  ImInvLength(const ImVec2& lhs, float fail_value)           { float d = lhs.x*lhs.x + lhs.y*lhs.y; if (d > 0.0f) return 1.0f / ImSqrt(d); return fail_value; } | ||||
| static inline float  ImFloor(float f)                                           { return (float)(int)f; } | ||||
| static inline ImVec2 ImFloor(const ImVec2& v)                                   { return ImVec2((float)(int)v.x, (float)(int)v.y); } | ||||
| static inline float  ImFloor(float f)                                           { return (float)(int)(f); } | ||||
| static inline ImVec2 ImFloor(const ImVec2& v)                                   { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); } | ||||
| static inline int    ImModPositive(int a, int b)                                { return (a + b) % b; } | ||||
| static inline float  ImDot(const ImVec2& a, const ImVec2& b)                    { return a.x * b.x + a.y * b.y; } | ||||
| static inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a)        { return ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); } | ||||
| @@ -636,7 +637,7 @@ struct IMGUI_API ImGuiMenuColumns | ||||
|     ImGuiMenuColumns(); | ||||
|     void        Update(int count, float spacing, bool clear); | ||||
|     float       DeclColumns(float w0, float w1, float w2); | ||||
|     float       CalcExtraSpace(float avail_w); | ||||
|     float       CalcExtraSpace(float avail_w) const; | ||||
| }; | ||||
|  | ||||
| // Internal state of the currently focused/edited text input box | ||||
|   | ||||
| @@ -859,7 +859,7 @@ bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, floa | ||||
|         // Apply scroll | ||||
|         // It is ok to modify Scroll here because we are being called in Begin() after the calculation of ContentSize and before setting up our starting position | ||||
|         const float scroll_v_norm = ImSaturate((clicked_v_norm - g.ScrollbarClickDeltaToGrabCenter - grab_h_norm * 0.5f) / (1.0f - grab_h_norm)); | ||||
|         *p_scroll_v = IM_FLOOR(0.5f + scroll_v_norm * scroll_max);//(win_size_contents_v - win_size_v)); | ||||
|         *p_scroll_v = IM_ROUND(scroll_v_norm * scroll_max);//(win_size_contents_v - win_size_v)); | ||||
|  | ||||
|         // Update values for rendering | ||||
|         scroll_ratio = ImSaturate(*p_scroll_v / scroll_max); | ||||
| @@ -1065,8 +1065,8 @@ bool ImGui::RadioButton(const char* label, bool active) | ||||
|         return false; | ||||
|  | ||||
|     ImVec2 center = check_bb.GetCenter(); | ||||
|     center.x = IM_FLOOR(center.x + 0.5f); | ||||
|     center.y = IM_FLOOR(center.y + 0.5f); | ||||
|     center.x = IM_ROUND(center.x); | ||||
|     center.y = IM_ROUND(center.y); | ||||
|     const float radius = (square_sz - 1.0f) * 0.5f; | ||||
|  | ||||
|     bool hovered, held; | ||||
| @@ -1355,7 +1355,7 @@ bool ImGui::SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float | ||||
|  | ||||
|     // Render | ||||
|     const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : (hovered && g.HoveredIdTimer >= hover_visibility_delay) ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator); | ||||
|     window->DrawList->AddRectFilled(bb_render.Min, bb_render.Max, col, g.Style.FrameRounding); | ||||
|     window->DrawList->AddRectFilled(bb_render.Min, bb_render.Max, col, 0.0f); | ||||
|  | ||||
|     return held; | ||||
| } | ||||
| @@ -4806,13 +4806,13 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl | ||||
|         draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size, sv_picker_size), col_white, hue_color32, hue_color32, col_white); | ||||
|         draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size, sv_picker_size), 0, 0, col_black, col_black); | ||||
|         RenderFrameBorder(picker_pos, picker_pos + ImVec2(sv_picker_size, sv_picker_size), 0.0f); | ||||
|         sv_cursor_pos.x = ImClamp(IM_FLOOR(picker_pos.x + ImSaturate(S)     * sv_picker_size + 0.5f), picker_pos.x + 2, picker_pos.x + sv_picker_size - 2); // Sneakily prevent the circle to stick out too much | ||||
|         sv_cursor_pos.y = ImClamp(IM_FLOOR(picker_pos.y + ImSaturate(1 - V) * sv_picker_size + 0.5f), picker_pos.y + 2, picker_pos.y + sv_picker_size - 2); | ||||
|         sv_cursor_pos.x = ImClamp(IM_ROUND(picker_pos.x + ImSaturate(S)     * sv_picker_size), picker_pos.x + 2, picker_pos.x + sv_picker_size - 2); // Sneakily prevent the circle to stick out too much | ||||
|         sv_cursor_pos.y = ImClamp(IM_ROUND(picker_pos.y + ImSaturate(1 - V) * sv_picker_size), picker_pos.y + 2, picker_pos.y + sv_picker_size - 2); | ||||
|  | ||||
|         // Render Hue Bar | ||||
|         for (int i = 0; i < 6; ++i) | ||||
|             draw_list->AddRectFilledMultiColor(ImVec2(bar0_pos_x, picker_pos.y + i * (sv_picker_size / 6)), ImVec2(bar0_pos_x + bars_width, picker_pos.y + (i + 1) * (sv_picker_size / 6)), col_hues[i], col_hues[i], col_hues[i + 1], col_hues[i + 1]); | ||||
|         float bar0_line_y = IM_FLOOR(picker_pos.y + H * sv_picker_size + 0.5f); | ||||
|         float bar0_line_y = IM_ROUND(picker_pos.y + H * sv_picker_size); | ||||
|         RenderFrameBorder(ImVec2(bar0_pos_x, picker_pos.y), ImVec2(bar0_pos_x + bars_width, picker_pos.y + sv_picker_size), 0.0f); | ||||
|         RenderArrowsForVerticalBar(draw_list, ImVec2(bar0_pos_x - 1, bar0_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f, style.Alpha); | ||||
|     } | ||||
| @@ -4830,7 +4830,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl | ||||
|         ImRect bar1_bb(bar1_pos_x, picker_pos.y, bar1_pos_x + bars_width, picker_pos.y + sv_picker_size); | ||||
|         RenderColorRectWithAlphaCheckerboard(bar1_bb.Min, bar1_bb.Max, 0, bar1_bb.GetWidth() / 2.0f, ImVec2(0.0f, 0.0f)); | ||||
|         draw_list->AddRectFilledMultiColor(bar1_bb.Min, bar1_bb.Max, user_col32_striped_of_alpha, user_col32_striped_of_alpha, user_col32_striped_of_alpha & ~IM_COL32_A_MASK, user_col32_striped_of_alpha & ~IM_COL32_A_MASK); | ||||
|         float bar1_line_y = IM_FLOOR(picker_pos.y + (1.0f - alpha) * sv_picker_size + 0.5f); | ||||
|         float bar1_line_y = IM_ROUND(picker_pos.y + (1.0f - alpha) * sv_picker_size); | ||||
|         RenderFrameBorder(bar1_bb.Min, bar1_bb.Max, 0.0f); | ||||
|         RenderArrowsForVerticalBar(draw_list, ImVec2(bar1_pos_x - 1, bar1_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f, style.Alpha); | ||||
|     } | ||||
| @@ -4887,7 +4887,7 @@ bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFl | ||||
|     bb_inner.Expand(off); | ||||
|     if ((flags & ImGuiColorEditFlags_AlphaPreviewHalf) && col_rgb.w < 1.0f) | ||||
|     { | ||||
|         float mid_x = IM_FLOOR((bb_inner.Min.x + bb_inner.Max.x) * 0.5f + 0.5f); | ||||
|         float mid_x = IM_ROUND((bb_inner.Min.x + bb_inner.Max.x) * 0.5f); | ||||
|         RenderColorRectWithAlphaCheckerboard(ImVec2(bb_inner.Min.x + grid_step, bb_inner.Min.y), bb_inner.Max, GetColorU32(col_rgb), grid_step, ImVec2(-grid_step + off, off), rounding, ImDrawCornerFlags_TopRight| ImDrawCornerFlags_BotRight); | ||||
|         window->DrawList->AddRectFilled(bb_inner.Min, ImVec2(mid_x, bb_inner.Max.y), GetColorU32(col_rgb_without_alpha), rounding, ImDrawCornerFlags_TopLeft|ImDrawCornerFlags_BotLeft); | ||||
|     } | ||||
| @@ -6000,7 +6000,7 @@ float ImGuiMenuColumns::DeclColumns(float w0, float w1, float w2) // not using v | ||||
|     return ImMax(Width, NextWidth); | ||||
| } | ||||
|  | ||||
| float ImGuiMenuColumns::CalcExtraSpace(float avail_w) | ||||
| float ImGuiMenuColumns::CalcExtraSpace(float avail_w) const | ||||
| { | ||||
|     return ImMax(0.0f, avail_w - Width); | ||||
| } | ||||
| @@ -6024,7 +6024,7 @@ bool ImGui::BeginMenuBar() | ||||
|     // We don't clip with current window clipping rectangle as it is already set to the area below. However we clip with window full rect. | ||||
|     // We remove 1 worth of rounding to Max.x to that text in long menus and small windows don't tend to display over the lower-right rounded area, which looks particularly glitchy. | ||||
|     ImRect bar_rect = window->MenuBarRect(); | ||||
|     ImRect clip_rect(ImFloor(bar_rect.Min.x + window->WindowBorderSize + 0.5f), ImFloor(bar_rect.Min.y + window->WindowBorderSize + 0.5f), ImFloor(ImMax(bar_rect.Min.x, bar_rect.Max.x - ImMax(window->WindowRounding, window->WindowBorderSize)) + 0.5f), ImFloor(bar_rect.Max.y + 0.5f)); | ||||
|     ImRect clip_rect(IM_ROUND(bar_rect.Min.x + window->WindowBorderSize), IM_ROUND(bar_rect.Min.y + window->WindowBorderSize), IM_ROUND(ImMax(bar_rect.Min.x, bar_rect.Max.x - ImMax(window->WindowRounding, window->WindowBorderSize))), IM_ROUND(bar_rect.Max.y)); | ||||
|     clip_rect.ClipWith(window->OuterRectClipped); | ||||
|     PushClipRect(clip_rect.Min, clip_rect.Max, false); | ||||
|  | ||||
| @@ -6465,8 +6465,8 @@ bool    ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImG | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         const float separator_min_x = tab_bar->BarRect.Min.x - ImFloor(window->WindowPadding.x * 0.5f); | ||||
|         const float separator_max_x = tab_bar->BarRect.Max.x + ImFloor(window->WindowPadding.x * 0.5f); | ||||
|         const float separator_min_x = tab_bar->BarRect.Min.x - IM_FLOOR(window->WindowPadding.x * 0.5f); | ||||
|         const float separator_max_x = tab_bar->BarRect.Max.x + IM_FLOOR(window->WindowPadding.x * 0.5f); | ||||
|         window->DrawList->AddLine(ImVec2(separator_min_x, y), ImVec2(separator_max_x, y), col, 1.0f); | ||||
|     } | ||||
|     return true; | ||||
| @@ -7560,8 +7560,8 @@ void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiColumnsFlag | ||||
|     { | ||||
|         // Compute clipping rectangle | ||||
|         ImGuiColumnData* column = &columns->Columns[n]; | ||||
|         float clip_x1 = ImFloor(0.5f + window->Pos.x + GetColumnOffset(n)); | ||||
|         float clip_x2 = ImFloor(0.5f + window->Pos.x + GetColumnOffset(n + 1) - 1.0f); | ||||
|         float clip_x1 = IM_ROUND(window->Pos.x + GetColumnOffset(n)); | ||||
|         float clip_x2 = IM_ROUND(window->Pos.x + GetColumnOffset(n + 1) - 1.0f); | ||||
|         column->ClipRect = ImRect(clip_x1, -FLT_MAX, clip_x2, +FLT_MAX); | ||||
|         column->ClipRect.ClipWith(window->ClipRect); | ||||
|     } | ||||
|   | ||||
| @@ -13,10 +13,8 @@ You may also load external .TTF/.OTF files. | ||||
| The files in this folder are suggested fonts, provided as a convenience. | ||||
|  | ||||
| Fonts are rasterized in a single texture at the time of calling either of io.Fonts->GetTexDataAsAlpha8()/GetTexDataAsRGBA32()/Build(). | ||||
| Also read the FAQ: https://www.dearimgui.org/faq | ||||
|  | ||||
| If you have other loading/merging/adding fonts, you can post on the Dear ImGui "Getting Started" forum: | ||||
|   https://discourse.dearimgui.org/c/getting-started | ||||
| Please read the FAQ: https://www.dearimgui.org/faq | ||||
| Please use the Discord server: http://discord.dearimgui.org and not the Github issue tracker for basic font loading questions. | ||||
|  | ||||
|  | ||||
| --------------------------------------- | ||||
| @@ -45,7 +43,6 @@ If you have other loading/merging/adding fonts, you can post on the Dear ImGui " | ||||
|       u8"hello" | ||||
|       u8"こんにちは"   // this will be encoded as UTF-8 | ||||
| - If you want to include a backslash \ character in your string literal, you need to double them e.g. "folder\\filename". | ||||
| - Please use the Discourse forum (https://discourse.dearimgui.org) and not the Github issue tracker for basic font loading questions. | ||||
|  | ||||
|  | ||||
| --------------------------------------- | ||||
|   | ||||
| @@ -545,7 +545,7 @@ bool ImFontAtlasBuildWithFreeType(FT_Library ft_library, ImFontAtlas* atlas, uns | ||||
|         const float descent = src_tmp.Font.Info.Descender; | ||||
|         ImFontAtlasBuildSetupFont(atlas, dst_font, &cfg, ascent, descent); | ||||
|         const float font_off_x = cfg.GlyphOffset.x; | ||||
|         const float font_off_y = cfg.GlyphOffset.y + IM_FLOOR(dst_font->Ascent + 0.5f); | ||||
|         const float font_off_y = cfg.GlyphOffset.y + IM_ROUND(dst_font->Ascent); | ||||
|  | ||||
|         const int padding = atlas->TexGlyphPadding; | ||||
|         for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user