Misc tidying up (zero-clear structures, more unused default in ClipRetFullscreen, NavApplyItemToResult() coding style fix)

Zero-clearing more structures
Remove arbitrary default ClipRetFullscreen value in ImDrawListSharedData.
Nav extracted NavApplyItemToResult() function.
Coding style fixes in OSX Backends.
This commit is contained in:
ocornut 2020-11-05 13:15:02 +01:00
parent 046057cebb
commit 5f97809cab
6 changed files with 62 additions and 75 deletions

View File

@ -1,3 +1,6 @@
// Dear ImGui: standalone example application for OSX + Metal.
// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp.
// Read online: https://github.com/ocornut/imgui/tree/master/docs
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
@ -31,13 +34,15 @@
@implementation ViewController @implementation ViewController
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil { - (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
_device = MTLCreateSystemDefaultDevice(); _device = MTLCreateSystemDefaultDevice();
_commandQueue = [_device newCommandQueue]; _commandQueue = [_device newCommandQueue];
if (!self.device) { if (!self.device)
{
NSLog(@"Metal is not supported"); NSLog(@"Metal is not supported");
abort(); abort();
} }
@ -75,11 +80,13 @@
return self; return self;
} }
- (MTKView *)mtkView { - (MTKView *)mtkView
{
return (MTKView *)self.view; return (MTKView *)self.view;
} }
- (void)loadView { - (void)loadView
{
self.view = [[MTKView alloc] initWithFrame:CGRectMake(0, 0, 1200, 720)]; self.view = [[MTKView alloc] initWithFrame:CGRectMake(0, 0, 1200, 720)];
} }
@ -104,14 +111,13 @@
// window, we'd want to be much more careful than just ingesting the complete event stream, though we // window, we'd want to be much more careful than just ingesting the complete event stream, though we
// do make an effort to be good citizens by passing along events when Dear ImGui doesn't want to capture. // do make an effort to be good citizens by passing along events when Dear ImGui doesn't want to capture.
NSEventMask eventMask = NSEventMaskKeyDown | NSEventMaskKeyUp | NSEventMaskFlagsChanged | NSEventTypeScrollWheel; NSEventMask eventMask = NSEventMaskKeyDown | NSEventMaskKeyUp | NSEventMaskFlagsChanged | NSEventTypeScrollWheel;
[NSEvent addLocalMonitorForEventsMatchingMask:eventMask handler:^NSEvent * _Nullable(NSEvent *event) { [NSEvent addLocalMonitorForEventsMatchingMask:eventMask handler:^NSEvent * _Nullable(NSEvent *event)
{
BOOL wantsCapture = ImGui_ImplOSX_HandleEvent(event, self.view); BOOL wantsCapture = ImGui_ImplOSX_HandleEvent(event, self.view);
if (event.type == NSEventTypeKeyDown && wantsCapture) { if (event.type == NSEventTypeKeyDown && wantsCapture)
return nil; return nil;
} else { else
return event; return event;
}
}]; }];
ImGui_ImplOSX_Init(); ImGui_ImplOSX_Init();
@ -174,15 +180,18 @@
// multitouch correctly at all. This causes the "cursor" to behave very erratically // multitouch correctly at all. This causes the "cursor" to behave very erratically
// when there are multiple active touches. But for demo purposes, single-touch // when there are multiple active touches. But for demo purposes, single-touch
// interaction actually works surprisingly well. // interaction actually works surprisingly well.
- (void)updateIOWithTouchEvent:(UIEvent *)event { - (void)updateIOWithTouchEvent:(UIEvent *)event
{
UITouch *anyTouch = event.allTouches.anyObject; UITouch *anyTouch = event.allTouches.anyObject;
CGPoint touchLocation = [anyTouch locationInView:self.view]; CGPoint touchLocation = [anyTouch locationInView:self.view];
ImGuiIO &io = ImGui::GetIO(); ImGuiIO &io = ImGui::GetIO();
io.MousePos = ImVec2(touchLocation.x, touchLocation.y); io.MousePos = ImVec2(touchLocation.x, touchLocation.y);
BOOL hasActiveTouch = NO; BOOL hasActiveTouch = NO;
for (UITouch *touch in event.allTouches) { for (UITouch *touch in event.allTouches)
if (touch.phase != UITouchPhaseEnded && touch.phase != UITouchPhaseCancelled) { {
if (touch.phase != UITouchPhaseEnded && touch.phase != UITouchPhaseCancelled)
{
hasActiveTouch = YES; hasActiveTouch = YES;
break; break;
} }
@ -190,19 +199,23 @@
io.MouseDown[0] = hasActiveTouch; io.MouseDown[0] = hasActiveTouch;
} }
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self updateIOWithTouchEvent:event]; [self updateIOWithTouchEvent:event];
} }
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { - (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self updateIOWithTouchEvent:event]; [self updateIOWithTouchEvent:event];
} }
- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { - (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self updateIOWithTouchEvent:event]; [self updateIOWithTouchEvent:event];
} }
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { - (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[self updateIOWithTouchEvent:event]; [self updateIOWithTouchEvent:event];
} }
@ -288,8 +301,8 @@
// Rendering // Rendering
ImGui::Render(); ImGui::Render();
ImDrawData* drawData = ImGui::GetDrawData(); ImDrawData* draw_data = ImGui::GetDrawData();
ImGui_ImplMetal_RenderDrawData(drawData, commandBuffer, renderEncoder); ImGui_ImplMetal_RenderDrawData(draw_data, commandBuffer, renderEncoder);
[renderEncoder popDebugGroup]; [renderEncoder popDebugGroup];
[renderEncoder endEncoding]; [renderEncoder endEncoding];
@ -316,8 +329,10 @@
@implementation AppDelegate @implementation AppDelegate
- (instancetype)init { - (instancetype)init
if (self = [super init]) { {
if (self = [super init])
{
NSViewController *rootViewController = [[ViewController alloc] initWithNibName:nil bundle:nil]; NSViewController *rootViewController = [[ViewController alloc] initWithNibName:nil bundle:nil];
self.window = [[NSWindow alloc] initWithContentRect:NSZeroRect self.window = [[NSWindow alloc] initWithContentRect:NSZeroRect
styleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable | NSWindowStyleMaskMiniaturizable styleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable | NSWindowStyleMaskMiniaturizable
@ -331,7 +346,8 @@
return self; return self;
} }
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender { - (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender
{
return YES; return YES;
} }
@ -363,14 +379,17 @@
#if TARGET_OS_OSX #if TARGET_OS_OSX
int main(int argc, const char * argv[]) { int main(int argc, const char * argv[])
{
return NSApplicationMain(argc, argv); return NSApplicationMain(argc, argv);
} }
#else #else
int main(int argc, char * argv[]) { int main(int argc, char * argv[])
@autoreleasepool { {
@autoreleasepool
{
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
} }
} }

View File

@ -139,7 +139,7 @@
animationTimer = nil; animationTimer = nil;
} }
// Forward Mouse/Keyboard events to dear imgui OSX backend. It returns true when imgui is expecting to use the event. // Forward Mouse/Keyboard events to Dear ImGui OSX backend.
-(void)keyUp:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); } -(void)keyUp:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); }
-(void)keyDown:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); } -(void)keyDown:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); }
-(void)flagsChanged:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); } -(void)flagsChanged:(NSEvent *)event { ImGui_ImplOSX_HandleEvent(event, self); }

View File

@ -862,6 +862,7 @@ static float NavUpdatePageUpPageDown();
static inline void NavUpdateAnyRequestFlag(); static inline void NavUpdateAnyRequestFlag();
static void NavEndFrame(); static void NavEndFrame();
static bool NavScoreItem(ImGuiNavMoveResult* result, ImRect cand); static bool NavScoreItem(ImGuiNavMoveResult* result, ImRect cand);
static void NavApplyItemToResult(ImGuiNavMoveResult* result, ImGuiWindow* window, ImGuiID id, const ImRect& nav_bb_rel);
static void NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, ImGuiID id); static void NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, ImGuiID id);
static ImVec2 NavCalcPreferredRefPos(); static ImVec2 NavCalcPreferredRefPos();
static void NavSaveLastChildNavWindowIntoParent(ImGuiWindow* nav_window); static void NavSaveLastChildNavWindowIntoParent(ImGuiWindow* nav_window);
@ -8377,6 +8378,14 @@ static bool ImGui::NavScoreItem(ImGuiNavMoveResult* result, ImRect cand)
return new_best; return new_best;
} }
static void ImGui::NavApplyItemToResult(ImGuiNavMoveResult* result, ImGuiWindow* window, ImGuiID id, const ImRect& nav_bb_rel)
{
result->Window = window;
result->ID = id;
result->FocusScopeId = window->DC.NavFocusScopeIdCurrent;
result->RectRel = nav_bb_rel;
}
// We get there when either NavId == id, or when g.NavAnyRequest is set (which is updated by NavUpdateAnyRequestFlag above) // We get there when either NavId == id, or when g.NavAnyRequest is set (which is updated by NavUpdateAnyRequestFlag above)
static void ImGui::NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, const ImGuiID id) static void ImGui::NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, const ImGuiID id)
{ {
@ -8417,25 +8426,14 @@ static void ImGui::NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, con
bool new_best = g.NavMoveRequest && NavScoreItem(result, nav_bb); bool new_best = g.NavMoveRequest && NavScoreItem(result, nav_bb);
#endif #endif
if (new_best) if (new_best)
{ NavApplyItemToResult(result, window, id, nav_bb_rel);
result->Window = window;
result->ID = id;
result->FocusScopeId = window->DC.NavFocusScopeIdCurrent;
result->RectRel = nav_bb_rel;
}
// Features like PageUp/PageDown need to maintain a separate score for the visible set of items. // Features like PageUp/PageDown need to maintain a separate score for the visible set of items.
const float VISIBLE_RATIO = 0.70f; const float VISIBLE_RATIO = 0.70f;
if ((g.NavMoveRequestFlags & ImGuiNavMoveFlags_AlsoScoreVisibleSet) && window->ClipRect.Overlaps(nav_bb)) if ((g.NavMoveRequestFlags & ImGuiNavMoveFlags_AlsoScoreVisibleSet) && window->ClipRect.Overlaps(nav_bb))
if (ImClamp(nav_bb.Max.y, window->ClipRect.Min.y, window->ClipRect.Max.y) - ImClamp(nav_bb.Min.y, window->ClipRect.Min.y, window->ClipRect.Max.y) >= (nav_bb.Max.y - nav_bb.Min.y) * VISIBLE_RATIO) if (ImClamp(nav_bb.Max.y, window->ClipRect.Min.y, window->ClipRect.Max.y) - ImClamp(nav_bb.Min.y, window->ClipRect.Min.y, window->ClipRect.Max.y) >= (nav_bb.Max.y - nav_bb.Min.y) * VISIBLE_RATIO)
if (NavScoreItem(&g.NavMoveResultLocalVisibleSet, nav_bb)) if (NavScoreItem(&g.NavMoveResultLocalVisibleSet, nav_bb))
{ NavApplyItemToResult(&g.NavMoveResultLocalVisibleSet, window, id, nav_bb_rel);
result = &g.NavMoveResultLocalVisibleSet;
result->Window = window;
result->ID = id;
result->FocusScopeId = window->DC.NavFocusScopeIdCurrent;
result->RectRel = nav_bb_rel;
}
} }
// Update window-relative bounding box of navigated item // Update window-relative bounding box of navigated item

View File

@ -344,21 +344,12 @@ void ImGui::StyleColorsLight(ImGuiStyle* dst)
ImDrawListSharedData::ImDrawListSharedData() ImDrawListSharedData::ImDrawListSharedData()
{ {
Font = NULL; memset(this, 0, sizeof(*this));
FontSize = 0.0f;
CurveTessellationTol = 0.0f;
CircleSegmentMaxError = 0.0f;
ClipRectFullscreen = ImVec4(-8192.0f, -8192.0f, +8192.0f, +8192.0f);
InitialFlags = ImDrawListFlags_None;
// Lookup tables
for (int i = 0; i < IM_ARRAYSIZE(ArcFastVtx); i++) for (int i = 0; i < IM_ARRAYSIZE(ArcFastVtx); i++)
{ {
const float a = ((float)i * 2 * IM_PI) / (float)IM_ARRAYSIZE(ArcFastVtx); const float a = ((float)i * 2 * IM_PI) / (float)IM_ARRAYSIZE(ArcFastVtx);
ArcFastVtx[i] = ImVec2(ImCos(a), ImSin(a)); ArcFastVtx[i] = ImVec2(ImCos(a), ImSin(a));
} }
memset(CircleSegmentCounts, 0, sizeof(CircleSegmentCounts)); // This will be set by SetCircleSegmentMaxError()
TexUvLines = NULL;
} }
void ImDrawListSharedData::SetCircleSegmentMaxError(float max_error) void ImDrawListSharedData::SetCircleSegmentMaxError(float max_error)

View File

@ -844,7 +844,7 @@ struct IMGUI_API ImGuiMenuColumns
float Width, NextWidth; float Width, NextWidth;
float Pos[3], NextWidths[3]; float Pos[3], NextWidths[3];
ImGuiMenuColumns(); ImGuiMenuColumns() { memset(this, 0, sizeof(*this)); }
void Update(int count, float spacing, bool clear); void Update(int count, float spacing, bool clear);
float DeclColumns(float w0, float w1, float w2); float DeclColumns(float w0, float w1, float w2);
float CalcExtraSpace(float avail_w) const; float CalcExtraSpace(float avail_w) const;
@ -897,7 +897,7 @@ struct ImGuiPopupData
ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse) ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse)
ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup
ImGuiPopupData() { PopupId = 0; Window = SourceWindow = NULL; OpenFrameCount = -1; OpenParentId = 0; } ImGuiPopupData() { memset(this, 0, sizeof(*this)); OpenFrameCount = -1; }
}; };
struct ImGuiNavMoveResult struct ImGuiNavMoveResult
@ -1006,7 +1006,7 @@ struct ImGuiColumnData
ImGuiColumnsFlags Flags; // Not exposed ImGuiColumnsFlags Flags; // Not exposed
ImRect ClipRect; ImRect ClipRect;
ImGuiColumnData() { OffsetNorm = OffsetNormBeforeResize = 0.0f; Flags = ImGuiColumnsFlags_None; } ImGuiColumnData() { memset(this, 0, sizeof(*this)); }
}; };
struct ImGuiColumns struct ImGuiColumns
@ -1027,21 +1027,7 @@ struct ImGuiColumns
ImVector<ImGuiColumnData> Columns; ImVector<ImGuiColumnData> Columns;
ImDrawListSplitter Splitter; ImDrawListSplitter Splitter;
ImGuiColumns() { Clear(); } ImGuiColumns() { memset(this, 0, sizeof(*this)); }
void Clear()
{
ID = 0;
Flags = ImGuiColumnsFlags_None;
IsFirstFrame = false;
IsBeingResized = false;
Current = 0;
Count = 1;
OffMinX = OffMaxX = 0.0f;
LineMinY = LineMaxY = 0.0f;
HostCursorPosY = 0.0f;
HostCursorMaxPosX = 0.0f;
Columns.clear();
}
}; };
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -1083,7 +1069,7 @@ struct ImGuiWindowSettings
bool Collapsed; bool Collapsed;
bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context) bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context)
ImGuiWindowSettings() { ID = 0; Pos = Size = ImVec2ih(0, 0); Collapsed = WantApply = false; } ImGuiWindowSettings() { memset(this, 0, sizeof(*this)); }
char* GetName() { return (char*)(this + 1); } char* GetName() { return (char*)(this + 1); }
}; };

View File

@ -6388,13 +6388,6 @@ void ImGui::Value(const char* prefix, float v, const char* float_format)
//------------------------------------------------------------------------- //-------------------------------------------------------------------------
// Helpers for internal use // Helpers for internal use
ImGuiMenuColumns::ImGuiMenuColumns()
{
Spacing = Width = NextWidth = 0.0f;
memset(Pos, 0, sizeof(Pos));
memset(NextWidths, 0, sizeof(NextWidths));
}
void ImGuiMenuColumns::Update(int count, float spacing, bool clear) void ImGuiMenuColumns::Update(int count, float spacing, bool clear)
{ {
IM_ASSERT(count == IM_ARRAYSIZE(Pos)); IM_ASSERT(count == IM_ARRAYSIZE(Pos));