mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-30 20:51:06 +01:00 
			
		
		
		
	Small optimizations to BeginDisabled() to allow frequent calls (#211)
Not intended for frequent calls but I suspect some people will do it either way... Rough/indicative: measured 0.1 ms for 5000 calls in release, 0.5 ms in debug on my desktop windows.
This commit is contained in:
		
							
								
								
									
										19
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								imgui.cpp
									
									
									
									
									
								
							| @@ -989,7 +989,7 @@ static void*                GImAllocatorUserData = NULL; | |||||||
| ImGuiStyle::ImGuiStyle() | ImGuiStyle::ImGuiStyle() | ||||||
| { | { | ||||||
|     Alpha                   = 1.0f;             // Global alpha applies to everything in Dear ImGui. |     Alpha                   = 1.0f;             // Global alpha applies to everything in Dear ImGui. | ||||||
|     DisabledAlpha           = 0.60f;            // Additional alpha multiplier for disabled items (multiply over current value of Alpha). |     DisabledAlpha           = 0.60f;            // Additional alpha multiplier applied by BeginDisabled(). Multiply over current value of Alpha. | ||||||
|     WindowPadding           = ImVec2(8,8);      // Padding within a window |     WindowPadding           = ImVec2(8,8);      // Padding within a window | ||||||
|     WindowRounding          = 0.0f;             // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended. |     WindowRounding          = 0.0f;             // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended. | ||||||
|     WindowBorderSize        = 1.0f;             // Thickness of border around windows. Generally set to 0.0f or 1.0f. Other values not well tested. |     WindowBorderSize        = 1.0f;             // Thickness of border around windows. Generally set to 0.0f or 1.0f. Other values not well tested. | ||||||
| @@ -6622,22 +6622,31 @@ void ImGui::PopItemFlag() | |||||||
| // - Visually this is currently altering alpha, but it is expected that in a future styling system this would work differently. | // - Visually this is currently altering alpha, but it is expected that in a future styling system this would work differently. | ||||||
| // - Feedback welcome at https://github.com/ocornut/imgui/issues/211 | // - Feedback welcome at https://github.com/ocornut/imgui/issues/211 | ||||||
| // - BeginDisabled(false) essentially does nothing but is provided to facilitate use of boolean expressions | // - BeginDisabled(false) essentially does nothing but is provided to facilitate use of boolean expressions | ||||||
|  | // - Optimized shortcuts instead of PushStyleVar() + PushItemFlag() | ||||||
| void ImGui::BeginDisabled(bool disabled) | void ImGui::BeginDisabled(bool disabled) | ||||||
| { | { | ||||||
|     ImGuiContext& g = *GImGui; |     ImGuiContext& g = *GImGui; | ||||||
|     bool was_disabled = (g.CurrentItemFlags & ImGuiItemFlags_Disabled) != 0; |     bool was_disabled = (g.CurrentItemFlags & ImGuiItemFlags_Disabled) != 0; | ||||||
|     if (!was_disabled && disabled) |     if (!was_disabled && disabled) | ||||||
|         PushStyleVar(ImGuiStyleVar_Alpha, g.Style.Alpha * g.Style.DisabledAlpha); |     { | ||||||
|     PushItemFlag(ImGuiItemFlags_Disabled, was_disabled || disabled); |         //PushStyleVar(ImGuiStyleVar_Alpha, g.Style.Alpha * g.Style.DisabledAlpha); | ||||||
|  |         g.DisabledAlphaBackup = g.Style.Alpha; | ||||||
|  |         g.Style.Alpha *= g.Style.DisabledAlpha; | ||||||
|  |     } | ||||||
|  |     //PushItemFlag(ImGuiItemFlags_Disabled, was_disabled || disabled); | ||||||
|  |     g.CurrentItemFlags |= ImGuiItemFlags_Disabled; | ||||||
|  |     g.ItemFlagsStack.push_back(g.CurrentItemFlags); | ||||||
| } | } | ||||||
|  |  | ||||||
| void ImGui::EndDisabled() | void ImGui::EndDisabled() | ||||||
| { | { | ||||||
|     ImGuiContext& g = *GImGui; |     ImGuiContext& g = *GImGui; | ||||||
|     bool was_disabled = (g.CurrentItemFlags & ImGuiItemFlags_Disabled) != 0; |     bool was_disabled = (g.CurrentItemFlags & ImGuiItemFlags_Disabled) != 0; | ||||||
|     PopItemFlag(); |     //PopItemFlag(); | ||||||
|  |     g.ItemFlagsStack.pop_back(); | ||||||
|  |     g.CurrentItemFlags &= ~ImGuiItemFlags_Disabled; | ||||||
|     if (was_disabled && (g.CurrentItemFlags & ImGuiItemFlags_Disabled) == 0) |     if (was_disabled && (g.CurrentItemFlags & ImGuiItemFlags_Disabled) == 0) | ||||||
|         PopStyleVar(); |         g.Style.Alpha = g.DisabledAlphaBackup; //PopStyleVar(); | ||||||
| } | } | ||||||
|  |  | ||||||
| // FIXME: Look into renaming this once we have settled the new Focus/Activation/TabStop system. | // FIXME: Look into renaming this once we have settled the new Focus/Activation/TabStop system. | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								imgui.h
									
									
									
									
									
								
							| @@ -1744,7 +1744,7 @@ IM_MSVC_RUNTIME_CHECKS_RESTORE | |||||||
| struct ImGuiStyle | struct ImGuiStyle | ||||||
| { | { | ||||||
|     float       Alpha;                      // Global alpha applies to everything in Dear ImGui. |     float       Alpha;                      // Global alpha applies to everything in Dear ImGui. | ||||||
|     float       DisabledAlpha;              // Additional alpha multiplier for disabled items (multiply over current value of Alpha). |     float       DisabledAlpha;              // Additional alpha multiplier applied by BeginDisabled(). Multiply over current value of Alpha. | ||||||
|     ImVec2      WindowPadding;              // Padding within a window. |     ImVec2      WindowPadding;              // Padding within a window. | ||||||
|     float       WindowRounding;             // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended. |     float       WindowRounding;             // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended. | ||||||
|     float       WindowBorderSize;           // Thickness of border around windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). |     float       WindowBorderSize;           // Thickness of border around windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). | ||||||
|   | |||||||
| @@ -1613,6 +1613,7 @@ struct ImGuiContext | |||||||
|     bool                    DragCurrentAccumDirty; |     bool                    DragCurrentAccumDirty; | ||||||
|     float                   DragCurrentAccum;                   // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings |     float                   DragCurrentAccum;                   // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings | ||||||
|     float                   DragSpeedDefaultRatio;              // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio |     float                   DragSpeedDefaultRatio;              // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio | ||||||
|  |     float                   DisabledAlphaBackup;                // Backup for style.Alpha for BeginDisabled() | ||||||
|     float                   ScrollbarClickDeltaToGrabCenter;    // Distance between mouse and center of grab box, normalized in parent space. Use storage? |     float                   ScrollbarClickDeltaToGrabCenter;    // Distance between mouse and center of grab box, normalized in parent space. Use storage? | ||||||
|     int                     TooltipOverrideCount; |     int                     TooltipOverrideCount; | ||||||
|     float                   TooltipSlowDelay;                   // Time before slow tooltips appears (FIXME: This is temporary until we merge in tooltip timer+priority work) |     float                   TooltipSlowDelay;                   // Time before slow tooltips appears (FIXME: This is temporary until we merge in tooltip timer+priority work) | ||||||
| @@ -1780,6 +1781,7 @@ struct ImGuiContext | |||||||
|         DragCurrentAccumDirty = false; |         DragCurrentAccumDirty = false; | ||||||
|         DragCurrentAccum = 0.0f; |         DragCurrentAccum = 0.0f; | ||||||
|         DragSpeedDefaultRatio = 1.0f / 100.0f; |         DragSpeedDefaultRatio = 1.0f / 100.0f; | ||||||
|  |         DisabledAlphaBackup = 0.0f; | ||||||
|         ScrollbarClickDeltaToGrabCenter = 0.0f; |         ScrollbarClickDeltaToGrabCenter = 0.0f; | ||||||
|         TooltipOverrideCount = 0; |         TooltipOverrideCount = 0; | ||||||
|         TooltipSlowDelay = 0.50f; |         TooltipSlowDelay = 0.50f; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user