From 6e99688fa74b3de5694a8e021619cc1ade51ee03 Mon Sep 17 00:00:00 2001 From: ocornut Date: Tue, 7 Apr 2015 14:03:17 +0100 Subject: [PATCH 1/4] Fixed user-facing version of IsItemHovered() ignoring overlapping windows --- imgui.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/imgui.cpp b/imgui.cpp index 9361deb0..7b056e94 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -4347,11 +4347,9 @@ static bool IsHovered(const ImRect& bb, ImGuiID id) { ImGuiWindow* window = GetCurrentWindow(); if (g.HoveredRootWindow == window->RootWindow) - { if ((g.ActiveId == 0 || g.ActiveId == id || g.ActiveIdIsFocusedOnly) && IsMouseHoveringRect(bb)) if (IsWindowContentHoverable(g.HoveredRootWindow)) return true; - } } return false; } @@ -7215,9 +7213,10 @@ static bool ItemAdd(const ImRect& bb, const ImGuiID* id) // So that clicking on items with no active id such as Text() still returns true with IsItemHovered() window->DC.LastItemHoveredRect = true; window->DC.LastItemHoveredAndUsable = false; - if (g.ActiveId == 0 || (id && g.ActiveId == *id) || g.ActiveIdIsFocusedOnly || (g.ActiveId == window->MoveID)) - if (IsWindowContentHoverable(window)) - window->DC.LastItemHoveredAndUsable = true; + if (g.HoveredRootWindow == window->RootWindow) + if (g.ActiveId == 0 || (id && g.ActiveId == *id) || g.ActiveIdIsFocusedOnly || (g.ActiveId == window->MoveID)) + if (IsWindowContentHoverable(window)) + window->DC.LastItemHoveredAndUsable = true; } else { From 3c6257b8b9f8cb4494add15af0b913341053cefa Mon Sep 17 00:00:00 2001 From: ocornut Date: Tue, 7 Apr 2015 14:04:43 +0100 Subject: [PATCH 2/4] Fixed IsRootWindowOrAnyChildFocused() crashing if no window has focus (introduced yesterday in c38c54af524280b4c7b1ddbbc8f2a6492d2c123e) --- imgui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/imgui.cpp b/imgui.cpp index 7b056e94..6a7048cb 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -3808,7 +3808,7 @@ bool ImGui::IsRootWindowOrAnyChildFocused() { ImGuiState& g = *GImGui; ImGuiWindow* root_window = GetCurrentWindow()->RootWindow; - return g.FocusedWindow->RootWindow == root_window; + return g.FocusedWindow && g.FocusedWindow->RootWindow == root_window; } float ImGui::GetWindowWidth() From 241ccb46d52f4f51ca92b1786e70cfcc085b36e2 Mon Sep 17 00:00:00 2001 From: ocornut Date: Tue, 7 Apr 2015 19:55:32 +0100 Subject: [PATCH 3/4] Update README.txt + screenshot --- README.md | 8 ++++---- web/performance_01.png | Bin 14380 -> 10619 bytes web/performance_01_close_up.png | Bin 7946 -> 0 bytes 3 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 web/performance_01_close_up.png diff --git a/README.md b/README.md index ffb4faed..03c62a37 100644 --- a/README.md +++ b/README.md @@ -81,17 +81,17 @@ In your Render function, try translating your projection matrix by (0.5f,0.5f) o Can you create elaborate/serious tools with ImGui? -Yes. I have written data browsers, debuggers, profilers and all sort of non-trivial tools with the library. There's no reason you cannot, and in my experience the simplicity of the API is very empowering. However note that ImGui is programmer centric and the immediate-mode GUI paradigm might requires a bit of adaptation before you can realize its full potential. +Yes. I have written data browsers, debuggers, profilers and all sort of non-trivial tools with the library. In my experience the simplicity of the API is very empowering. However note that ImGui is programmer centric and the immediate-mode GUI paradigm might requires a bit of adaptation before you can realize its full potential. Is ImGui fast? -Down the fundation of its visual design, ImGui is engineered to be fairly performant both in term of CPU and GPU usage. Running elaborate code and creating elaborate UI will of course have a cost but ImGui aims to minimize it. +Down to the fundation of its visual design, ImGui is engineered to be fairly performant both in term of CPU and GPU usage. Running elaborate code and creating elaborate UI will of course have a cost but ImGui aims to minimize it. Mileage may vary but the following screenshot may give you a rough idea of the cost of running and rendering UI code (In the case of a trivial demo application like this one, your driver/os setup may be a bottleneck and cause higher variation or throttled framerate. Testing performance as part of a real application is recommended). -![performance screenshot](/web/performance_01_close_up.png?raw=true) +![performance screenshot](/web/performance_01.png?raw=true) -This is showing framerate for the full application loop on my 2011 iMac running Windows 7, OpenGL, AMD Radeon HD 6700M with an optimized executable. ([click here for the full-size picture](/web/performance_01.png)). +This is showing framerate for the full application loop on my 2011 iMac running Windows 7, OpenGL, AMD Radeon HD 6700M with an optimized executable. In contrast, librairies featuring higher-quality rendering and layouting techniques may have a higher resources footprint. If you intend to display large lists of items (say, 1000+) it can be beneficial for your code to perform clipping manually - using helpers such as CalcListClipping() - in order to avoid submitting them to ImGui in the first place. Even though ImGui will discard your clipped items it still needs to calculate their size and that overhead will add up if you have thousands of items. diff --git a/web/performance_01.png b/web/performance_01.png index 112d3d37d7118e8affc3de33140f451c8d7563b6..eb20f72a901bd9c85502a88e9ec30dd6ea36648e 100644 GIT binary patch literal 10619 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 literal 14380 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 q51i|1NY#A)zhxvRh`r{1qUw%t5HCRnR( Date: Tue, 7 Apr 2015 20:09:59 +0100 Subject: [PATCH 4/4] Update README.md --- README.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 03c62a37..f8ef61d4 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ ImGui allows you create elaborate tools as well as very short-lived ones. On the Demo ---- -You should be able to build the examples from sources (tested on Winodws/Mac/Linux). If you don't, let me know! If you want to have a quick look at the features of ImGui, you can download binaries of the demo app here. +You should be able to build the examples from sources (tested on Windows/Mac/Linux). If you don't, let me know! If you want to have a quick look at the features of ImGui, you can download binaries of the demo app here. - [imgui-demo-binaries-20150321.zip](http://www.miracleworld.net/imgui/binaries/imgui-demo-binaries-20150321.zip) (Windows binaries, ImGui 1.37 WIP 2015/03/31, 4 executables, 391 KB) @@ -67,13 +67,15 @@ The Immediate Mode GUI paradigm may at first appear unusual to some users. This Frequently Asked Question ------------------------- -Where are samples? +Where is the documentation? -The bulk of example user code is contained within the ImGui::ShowTestWindow() function. It covers most features of ImGui so you can read the code and call the function itself to see its output. Ready-to-go example applications covering different versions of OpenGL/DirectX are provided in the examples/ folder. +- The documentation is at the top of imgui.cpp + effectively imgui.h. +- Example code is in the ImGui::ShowTestWindow() function. It covers most features of ImGui so you can read the code and call the function itself to see its output. +- Standalone example applications using OpenGL/DirectX are provided in the examples/ folder. How do you use ImGui on a platform that may not have a mouse or keyboard? -I recommend using [Synergy](http://synergy-project.org) ([sources](https://github.com/synergy/synergy)). With the uSynergy.c micro client running on your platform and connecting to your PC, you can seamlessly use your PC input devices from a video game console or a tablet. ImGui allows to increase the hit box of widgets (via the _TouchPadding_ setting) to accomodate a little for the lack of precision of touch inputs, but it is recommended you use a mouse to allow optimising for screen real-estate. +I recommend using [Synergy](http://synergy-project.org) ([sources](https://github.com/synergy/synergy)). In particular, the _src/micro/uSynergy.c_ file contains a small client that you can use on any platform to connect to your host PC. You can seamlessly use your PC input devices from a video game console or a tablet. ImGui allows to increase the hit box of widgets (via the _TouchPadding_ setting) to accomodate a little for the lack of precision of touch inputs, but it is recommended you use a mouse to allow optimising for screen real-estate. I integrated ImGui in my engine and the text or lines are blurry.. @@ -87,14 +89,13 @@ Yes. I have written data browsers, debuggers, profilers and all sort of non-triv Down to the fundation of its visual design, ImGui is engineered to be fairly performant both in term of CPU and GPU usage. Running elaborate code and creating elaborate UI will of course have a cost but ImGui aims to minimize it. -Mileage may vary but the following screenshot may give you a rough idea of the cost of running and rendering UI code (In the case of a trivial demo application like this one, your driver/os setup may be a bottleneck and cause higher variation or throttled framerate. Testing performance as part of a real application is recommended). +Mileage may vary but the following screenshot can give you a rough idea of the cost of running and rendering UI code (In the case of a trivial demo application like this one, your driver/os setup are likely to be the bottleneck. Testing performance as part of a real application is recommended). ![performance screenshot](/web/performance_01.png?raw=true) -This is showing framerate for the full application loop on my 2011 iMac running Windows 7, OpenGL, AMD Radeon HD 6700M with an optimized executable. -In contrast, librairies featuring higher-quality rendering and layouting techniques may have a higher resources footprint. +This is showing framerate for the full application loop on my 2011 iMac running Windows 7, OpenGL, AMD Radeon HD 6700M with an optimized executable. In contrast, librairies featuring higher-quality rendering and layouting techniques may have a higher resources footprint. -If you intend to display large lists of items (say, 1000+) it can be beneficial for your code to perform clipping manually - using helpers such as CalcListClipping() - in order to avoid submitting them to ImGui in the first place. Even though ImGui will discard your clipped items it still needs to calculate their size and that overhead will add up if you have thousands of items. +If you intend to display large lists of items (say, 1000+) it can be beneficial for your code to perform clipping manually - using helpers such as CalcListClipping() - in order to avoid submitting them to ImGui in the first place. Even though ImGui will discard your clipped items it still needs to calculate their size and that overhead will add up if you have thousands of items. If you can handle clipping and height positionning yourself then browsing a list with millions of items isn't a problem. Can you reskin the look of ImGui?