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 9361deb04..7b056e941 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 7b056e941..6a7048cbf 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 ffb4faed0..03c62a372 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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 O7(8A5T-G@yGywo>!6)AU diff --git a/web/performance_01_close_up.png b/web/performance_01_close_up.png deleted file mode 100644 index a3811ec024cebe8d3d360247755514ebcd3d32f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7946 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 From b9dd7c65ab956dfc98fe47e71a97434761392a4a Mon Sep 17 00:00:00 2001 From: omar 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 03c62a372..f8ef61d44 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?