parent
414165d23f
commit
6868d11669
@ -4,8 +4,7 @@
|
|||||||
// Implemented features:
|
// Implemented features:
|
||||||
// [X] Renderer: User texture binding. Use 'MTLTexture' as ImTextureID. Read the FAQ about ImTextureID!
|
// [X] Renderer: User texture binding. Use 'MTLTexture' as ImTextureID. Read the FAQ about ImTextureID!
|
||||||
// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
|
// [X] Renderer: Support for large meshes (64k+ vertices) with 16-bit indices.
|
||||||
// Missing features:
|
// [X] Renderer: Multi-viewport / platform windows.
|
||||||
// [ ] Renderer: Multi-viewport / platform windows.
|
|
||||||
|
|
||||||
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
||||||
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
|
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
|
||||||
@ -14,6 +13,7 @@
|
|||||||
|
|
||||||
// CHANGELOG
|
// CHANGELOG
|
||||||
// (minor and older changes stripped away, please see git history for details)
|
// (minor and older changes stripped away, please see git history for details)
|
||||||
|
// 2022-05-03: Misc: Implemented support for viewports / platform windows.
|
||||||
// 2022-04-27: Misc: Store backend data in a per-context struct, allowing to use this backend with multiple contexts.
|
// 2022-04-27: Misc: Store backend data in a per-context struct, allowing to use this backend with multiple contexts.
|
||||||
// 2022-01-03: Metal: Ignore ImDrawCmd where ElemCount == 0 (very rare but can technically be manufactured by user code).
|
// 2022-01-03: Metal: Ignore ImDrawCmd where ElemCount == 0 (very rare but can technically be manufactured by user code).
|
||||||
// 2021-12-30: Metal: Added Metal C++ support. Enable with '#define IMGUI_IMPL_METAL_CPP' in your imconfig.h file.
|
// 2021-12-30: Metal: Added Metal C++ support. Enable with '#define IMGUI_IMPL_METAL_CPP' in your imconfig.h file.
|
||||||
@ -32,6 +32,12 @@
|
|||||||
#import <time.h>
|
#import <time.h>
|
||||||
#import <Metal/Metal.h>
|
#import <Metal/Metal.h>
|
||||||
|
|
||||||
|
// Forward Declarations
|
||||||
|
static void ImGui_ImplMetal_InitPlatformInterface();
|
||||||
|
static void ImGui_ImplMetal_ShutdownPlatformInterface();
|
||||||
|
static void ImGui_ImplMetal_CreateDeviceObjectsForPlatformWindows();
|
||||||
|
static void ImGui_ImplMetal_InvalidateDeviceObjectsForPlatformWindows();
|
||||||
|
|
||||||
#pragma mark - Support classes
|
#pragma mark - Support classes
|
||||||
|
|
||||||
// A wrapper around a MTLBuffer object that knows the last time it was reused
|
// A wrapper around a MTLBuffer object that knows the last time it was reused
|
||||||
@ -137,15 +143,20 @@ bool ImGui_ImplMetal_Init(id<MTLDevice> device)
|
|||||||
io.BackendRendererUserData = (void*)bd;
|
io.BackendRendererUserData = (void*)bd;
|
||||||
io.BackendRendererName = "imgui_impl_metal";
|
io.BackendRendererName = "imgui_impl_metal";
|
||||||
io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
|
io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
|
||||||
|
io.BackendFlags |= ImGuiBackendFlags_RendererHasViewports; // We can create multi-viewports on the Renderer side (optional)
|
||||||
|
|
||||||
bd->SharedMetalContext = [[MetalContext alloc] init];
|
bd->SharedMetalContext = [[MetalContext alloc] init];
|
||||||
bd->SharedMetalContext.device = device;
|
bd->SharedMetalContext.device = device;
|
||||||
|
|
||||||
|
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
|
||||||
|
ImGui_ImplMetal_InitPlatformInterface();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui_ImplMetal_Shutdown()
|
void ImGui_ImplMetal_Shutdown()
|
||||||
{
|
{
|
||||||
|
ImGui_ImplMetal_ShutdownPlatformInterface();
|
||||||
ImGui_ImplMetal_DestroyDeviceObjects();
|
ImGui_ImplMetal_DestroyDeviceObjects();
|
||||||
ImGui_ImplMetal_DestroyBackendData();
|
ImGui_ImplMetal_DestroyBackendData();
|
||||||
}
|
}
|
||||||
@ -189,6 +200,7 @@ bool ImGui_ImplMetal_CreateDeviceObjects(id<MTLDevice> device)
|
|||||||
{
|
{
|
||||||
ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData();
|
ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData();
|
||||||
[bd->SharedMetalContext makeDeviceObjectsWithDevice:device];
|
[bd->SharedMetalContext makeDeviceObjectsWithDevice:device];
|
||||||
|
ImGui_ImplMetal_CreateDeviceObjectsForPlatformWindows();
|
||||||
ImGui_ImplMetal_CreateFontsTexture(device);
|
ImGui_ImplMetal_CreateFontsTexture(device);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -198,9 +210,155 @@ void ImGui_ImplMetal_DestroyDeviceObjects()
|
|||||||
{
|
{
|
||||||
ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData();
|
ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData();
|
||||||
ImGui_ImplMetal_DestroyFontsTexture();
|
ImGui_ImplMetal_DestroyFontsTexture();
|
||||||
|
ImGui_ImplMetal_InvalidateDeviceObjectsForPlatformWindows();
|
||||||
[bd->SharedMetalContext emptyRenderPipelineStateCache];
|
[bd->SharedMetalContext emptyRenderPipelineStateCache];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma mark - Multi-viewport support
|
||||||
|
|
||||||
|
#import <QuartzCore/CAMetalLayer.h>
|
||||||
|
|
||||||
|
#if TARGET_OS_OSX
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------
|
||||||
|
// MULTI-VIEWPORT / PLATFORM INTERFACE SUPPORT
|
||||||
|
// This is an _advanced_ and _optional_ feature, allowing the back-end to create and handle multiple viewports simultaneously.
|
||||||
|
// If you are new to dear imgui or creating a new binding for dear imgui, it is recommended that you completely ignore this section first..
|
||||||
|
//--------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
struct ImGuiViewportDataMetal
|
||||||
|
{
|
||||||
|
CAMetalLayer* MetalLayer;
|
||||||
|
id<MTLCommandQueue> CommandQueue;
|
||||||
|
MTLRenderPassDescriptor* RenderPassDescriptor;
|
||||||
|
void* Handle = NULL;
|
||||||
|
bool FirstFrame = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void ImGui_ImplMetal_CreateWindow(ImGuiViewport* viewport)
|
||||||
|
{
|
||||||
|
ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData();
|
||||||
|
ImGuiViewportDataMetal* data = IM_NEW(ImGuiViewportDataMetal)();
|
||||||
|
viewport->RendererUserData = data;
|
||||||
|
|
||||||
|
// PlatformHandleRaw should always be a NSWindow*, whereas PlatformHandle might be a higher-level handle (e.g. GLFWWindow*, SDL_Window*).
|
||||||
|
// Some back-ends will leave PlatformHandleRaw NULL, in which case we assume PlatformHandle will contain the NSWindow*.
|
||||||
|
void* handle = viewport->PlatformHandleRaw ? viewport->PlatformHandleRaw : viewport->PlatformHandle;
|
||||||
|
IM_ASSERT(handle != NULL);
|
||||||
|
|
||||||
|
id<MTLDevice> device = [bd->SharedMetalContext.depthStencilState device];
|
||||||
|
CAMetalLayer* layer = [CAMetalLayer layer];
|
||||||
|
layer.device = device;
|
||||||
|
layer.framebufferOnly = YES;
|
||||||
|
layer.pixelFormat = MTLPixelFormatBGRA8Unorm;
|
||||||
|
#if TARGET_OS_OSX
|
||||||
|
NSWindow* window = (__bridge NSWindow*)handle;
|
||||||
|
NSView* view = window.contentView;
|
||||||
|
view.layer = layer;
|
||||||
|
view.wantsLayer = YES;
|
||||||
|
#endif
|
||||||
|
data->MetalLayer = layer;
|
||||||
|
data->CommandQueue = [device newCommandQueue];
|
||||||
|
data->RenderPassDescriptor = [[MTLRenderPassDescriptor alloc] init];
|
||||||
|
data->Handle = handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplMetal_DestroyWindow(ImGuiViewport* viewport)
|
||||||
|
{
|
||||||
|
// The main viewport (owned by the application) will always have RendererUserData == NULL since we didn't create the data for it.
|
||||||
|
if (ImGuiViewportDataMetal* data = (ImGuiViewportDataMetal*)viewport->RendererUserData)
|
||||||
|
IM_DELETE(data);
|
||||||
|
viewport->RendererUserData = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline static CGSize MakeScaledSize(CGSize size, CGFloat scale)
|
||||||
|
{
|
||||||
|
return CGSizeMake(size.width * scale, size.height * scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplMetal_SetWindowSize(ImGuiViewport* viewport, ImVec2 size)
|
||||||
|
{
|
||||||
|
ImGuiViewportDataMetal* data = (ImGuiViewportDataMetal*)viewport->RendererUserData;
|
||||||
|
data->MetalLayer.drawableSize = MakeScaledSize(CGSizeMake(size.x, size.y), viewport->DpiScale);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplMetal_RenderWindow(ImGuiViewport* viewport, void*)
|
||||||
|
{
|
||||||
|
ImGuiViewportDataMetal* data = (ImGuiViewportDataMetal*)viewport->RendererUserData;
|
||||||
|
|
||||||
|
#if TARGET_OS_OSX
|
||||||
|
void* handle = viewport->PlatformHandleRaw ? viewport->PlatformHandleRaw : viewport->PlatformHandle;
|
||||||
|
NSWindow* window = (__bridge NSWindow*)handle;
|
||||||
|
|
||||||
|
// Always render the first frame, regardless of occlusionState, to avoid an initial flicker
|
||||||
|
if ((window.occlusionState & NSWindowOcclusionStateVisible) == 0 && !data->FirstFrame)
|
||||||
|
{
|
||||||
|
// Do not render windows which are completely occluded. Calling -[CAMetalLayer nextDrawable] will hang for
|
||||||
|
// approximately 1 second if the Metal layer is completely occluded.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
data->FirstFrame = false;
|
||||||
|
|
||||||
|
viewport->DpiScale = static_cast<float>(window.backingScaleFactor);
|
||||||
|
if (data->MetalLayer.contentsScale != viewport->DpiScale)
|
||||||
|
{
|
||||||
|
data->MetalLayer.contentsScale = viewport->DpiScale;
|
||||||
|
data->MetalLayer.drawableSize = MakeScaledSize(window.frame.size, viewport->DpiScale);
|
||||||
|
}
|
||||||
|
viewport->DrawData->FramebufferScale = ImVec2(viewport->DpiScale, viewport->DpiScale);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
id <CAMetalDrawable> drawable = [data->MetalLayer nextDrawable];
|
||||||
|
if (drawable == nil)
|
||||||
|
return;
|
||||||
|
|
||||||
|
MTLRenderPassDescriptor* renderPassDescriptor = data->RenderPassDescriptor;
|
||||||
|
renderPassDescriptor.colorAttachments[0].texture = drawable.texture;
|
||||||
|
renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(0, 0, 0, 0);
|
||||||
|
if ((viewport->Flags & ImGuiViewportFlags_NoRendererClear) == 0)
|
||||||
|
renderPassDescriptor.colorAttachments[0].loadAction = MTLLoadActionClear;
|
||||||
|
|
||||||
|
id <MTLCommandBuffer> commandBuffer = [data->CommandQueue commandBuffer];
|
||||||
|
id <MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];
|
||||||
|
ImGui_ImplMetal_RenderDrawData(viewport->DrawData, commandBuffer, renderEncoder);
|
||||||
|
[renderEncoder endEncoding];
|
||||||
|
|
||||||
|
[commandBuffer presentDrawable:drawable];
|
||||||
|
[commandBuffer commit];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplMetal_InitPlatformInterface()
|
||||||
|
{
|
||||||
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
||||||
|
platform_io.Renderer_CreateWindow = ImGui_ImplMetal_CreateWindow;
|
||||||
|
platform_io.Renderer_DestroyWindow = ImGui_ImplMetal_DestroyWindow;
|
||||||
|
platform_io.Renderer_SetWindowSize = ImGui_ImplMetal_SetWindowSize;
|
||||||
|
platform_io.Renderer_RenderWindow = ImGui_ImplMetal_RenderWindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplMetal_ShutdownPlatformInterface()
|
||||||
|
{
|
||||||
|
ImGui::DestroyPlatformWindows();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplMetal_CreateDeviceObjectsForPlatformWindows()
|
||||||
|
{
|
||||||
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
||||||
|
for (int i = 1; i < platform_io.Viewports.Size; i++)
|
||||||
|
if (!platform_io.Viewports[i]->RendererUserData)
|
||||||
|
ImGui_ImplMetal_CreateWindow(platform_io.Viewports[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplMetal_InvalidateDeviceObjectsForPlatformWindows()
|
||||||
|
{
|
||||||
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
||||||
|
for (int i = 1; i < platform_io.Viewports.Size; i++)
|
||||||
|
if (platform_io.Viewports[i]->RendererUserData)
|
||||||
|
ImGui_ImplMetal_DestroyWindow(platform_io.Viewports[i]);
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark - MetalBuffer implementation
|
#pragma mark - MetalBuffer implementation
|
||||||
|
|
||||||
@implementation MetalBuffer
|
@implementation MetalBuffer
|
||||||
|
@ -8,8 +8,7 @@
|
|||||||
// [X] Platform: OSX clipboard is supported within core Dear ImGui (no specific code in this backend).
|
// [X] Platform: OSX clipboard is supported within core Dear ImGui (no specific code in this backend).
|
||||||
// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
|
// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
|
||||||
// [X] Platform: IME support.
|
// [X] Platform: IME support.
|
||||||
// Issues:
|
// [X] Platform: Multi-viewport / platform windows.
|
||||||
// [ ] Platform: Multi-viewport / platform windows.
|
|
||||||
|
|
||||||
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
||||||
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
|
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
|
||||||
|
@ -8,8 +8,7 @@
|
|||||||
// [X] Platform: OSX clipboard is supported within core Dear ImGui (no specific code in this backend).
|
// [X] Platform: OSX clipboard is supported within core Dear ImGui (no specific code in this backend).
|
||||||
// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
|
// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'.
|
||||||
// [X] Platform: IME support.
|
// [X] Platform: IME support.
|
||||||
// Issues:
|
// [X] Platform: Multi-viewport / platform windows.
|
||||||
// [ ] Platform: Multi-viewport / platform windows.
|
|
||||||
|
|
||||||
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this.
|
||||||
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
|
// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need.
|
||||||
@ -25,6 +24,7 @@
|
|||||||
|
|
||||||
// CHANGELOG
|
// CHANGELOG
|
||||||
// (minor and older changes stripped away, please see git history for details)
|
// (minor and older changes stripped away, please see git history for details)
|
||||||
|
// 2022-05-03: Misc: Implemented support for viewports / platform windows.
|
||||||
// 2022-05-03: Inputs: Removed ImGui_ImplOSX_HandleEvent() from backend API in favor of backend automatically handling event capture.
|
// 2022-05-03: Inputs: Removed ImGui_ImplOSX_HandleEvent() from backend API in favor of backend automatically handling event capture.
|
||||||
// 2022-04-27: Misc: Store backend data in a per-context struct, allowing to use this backend with multiple contexts.
|
// 2022-04-27: Misc: Store backend data in a per-context struct, allowing to use this backend with multiple contexts.
|
||||||
// 2022-03-22: Inputs: Monitor NSKeyUp events to catch missing keyUp for key when user press Cmd + key
|
// 2022-03-22: Inputs: Monitor NSKeyUp events to catch missing keyUp for key when user press Cmd + key
|
||||||
@ -70,6 +70,7 @@ struct ImGui_ImplOSX_Data
|
|||||||
KeyEventResponder* KeyEventResponder;
|
KeyEventResponder* KeyEventResponder;
|
||||||
NSTextInputContext* InputContext;
|
NSTextInputContext* InputContext;
|
||||||
id Monitor;
|
id Monitor;
|
||||||
|
NSWindow* Window;
|
||||||
|
|
||||||
ImGui_ImplOSX_Data() { memset(this, 0, sizeof(*this)); }
|
ImGui_ImplOSX_Data() { memset(this, 0, sizeof(*this)); }
|
||||||
};
|
};
|
||||||
@ -81,6 +82,9 @@ static void ImGui_ImplOSX_DestroyBackendData() { IM_DELETE(ImGui
|
|||||||
static inline CFTimeInterval GetMachAbsoluteTimeInSeconds() { return static_cast<CFTimeInterval>(static_cast<double>(clock_gettime_nsec_np(CLOCK_UPTIME_RAW)) / 1e9); }
|
static inline CFTimeInterval GetMachAbsoluteTimeInSeconds() { return static_cast<CFTimeInterval>(static_cast<double>(clock_gettime_nsec_np(CLOCK_UPTIME_RAW)) / 1e9); }
|
||||||
|
|
||||||
// Forward Declarations
|
// Forward Declarations
|
||||||
|
static void ImGui_ImplOSX_InitPlatformInterface();
|
||||||
|
static void ImGui_ImplOSX_ShutdownPlatformInterface();
|
||||||
|
static void ImGui_ImplOSX_UpdateMonitors();
|
||||||
static void ImGui_ImplOSX_AddTrackingArea(NSView* _Nonnull view);
|
static void ImGui_ImplOSX_AddTrackingArea(NSView* _Nonnull view);
|
||||||
static bool ImGui_ImplOSX_HandleEvent(NSEvent* event, NSView* view);
|
static bool ImGui_ImplOSX_HandleEvent(NSEvent* event, NSView* view);
|
||||||
|
|
||||||
@ -224,6 +228,7 @@ static bool ImGui_ImplOSX_HandleEvent(NSEvent* event, NSView* view);
|
|||||||
|
|
||||||
- (void)onApplicationBecomeActive:(NSNotification*)aNotification;
|
- (void)onApplicationBecomeActive:(NSNotification*)aNotification;
|
||||||
- (void)onApplicationBecomeInactive:(NSNotification*)aNotification;
|
- (void)onApplicationBecomeInactive:(NSNotification*)aNotification;
|
||||||
|
- (void)displaysDidChange:(NSNotification*)aNotification;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@ -241,6 +246,11 @@ static bool ImGui_ImplOSX_HandleEvent(NSEvent* event, NSView* view);
|
|||||||
io.AddFocusEvent(false);
|
io.AddFocusEvent(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)displaysDidChange:(NSNotification*)aNotification
|
||||||
|
{
|
||||||
|
ImGui_ImplOSX_UpdateMonitors();
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
// Functions
|
// Functions
|
||||||
@ -376,11 +386,16 @@ bool ImGui_ImplOSX_Init(NSView* view)
|
|||||||
// Setup backend capabilities flags
|
// Setup backend capabilities flags
|
||||||
io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional)
|
io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional)
|
||||||
//io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used)
|
//io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used)
|
||||||
//io.BackendFlags |= ImGuiBackendFlags_PlatformHasViewports; // We can create multi-viewports on the Platform side (optional)
|
io.BackendFlags |= ImGuiBackendFlags_PlatformHasViewports; // We can create multi-viewports on the Platform side (optional)
|
||||||
//io.BackendFlags |= ImGuiBackendFlags_HasMouseHoveredViewport; // We can call io.AddMouseViewportEvent() with correct data (optional)
|
//io.BackendFlags |= ImGuiBackendFlags_HasMouseHoveredViewport; // We can call io.AddMouseViewportEvent() with correct data (optional)
|
||||||
io.BackendPlatformName = "imgui_impl_osx";
|
io.BackendPlatformName = "imgui_impl_osx";
|
||||||
|
|
||||||
bd->Observer = [ImGuiObserver new];
|
bd->Observer = [ImGuiObserver new];
|
||||||
|
bd->Window = view.window ?: NSApp.orderedWindows.firstObject;
|
||||||
|
ImGuiViewport* main_viewport = ImGui::GetMainViewport();
|
||||||
|
main_viewport->PlatformHandle = main_viewport->PlatformHandleRaw = (__bridge_retained void*)bd->Window;
|
||||||
|
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
|
||||||
|
ImGui_ImplOSX_InitPlatformInterface();
|
||||||
|
|
||||||
// Load cursors. Some of them are undocumented.
|
// Load cursors. Some of them are undocumented.
|
||||||
bd->MouseCursorHidden = false;
|
bd->MouseCursorHidden = false;
|
||||||
@ -460,13 +475,7 @@ bool ImGui_ImplOSX_Init(NSView* view)
|
|||||||
|
|
||||||
void ImGui_ImplOSX_Shutdown()
|
void ImGui_ImplOSX_Shutdown()
|
||||||
{
|
{
|
||||||
ImGui_ImplOSX_Data* bd = ImGui_ImplOSX_GetBackendData();
|
ImGui_ImplOSX_ShutdownPlatformInterface();
|
||||||
bd->Observer = NULL;
|
|
||||||
if (bd->Monitor != NULL)
|
|
||||||
{
|
|
||||||
[NSEvent removeMonitor:bd->Monitor];
|
|
||||||
bd->Monitor = NULL;
|
|
||||||
}
|
|
||||||
ImGui_ImplOSX_DestroyBackendData();
|
ImGui_ImplOSX_DestroyBackendData();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -618,10 +627,22 @@ static bool ImGui_ImplOSX_HandleEvent(NSEvent* event, NSView* view)
|
|||||||
|
|
||||||
if (event.type == NSEventTypeMouseMoved || event.type == NSEventTypeLeftMouseDragged || event.type == NSEventTypeRightMouseDragged || event.type == NSEventTypeOtherMouseDragged)
|
if (event.type == NSEventTypeMouseMoved || event.type == NSEventTypeLeftMouseDragged || event.type == NSEventTypeRightMouseDragged || event.type == NSEventTypeOtherMouseDragged)
|
||||||
{
|
{
|
||||||
NSPoint mousePoint = event.locationInWindow;
|
NSPoint mousePoint;
|
||||||
mousePoint = [view convertPoint:mousePoint fromView:nil];
|
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
|
||||||
mousePoint = NSMakePoint(mousePoint.x, view.bounds.size.height - mousePoint.y);
|
{
|
||||||
|
mousePoint = NSEvent.mouseLocation;
|
||||||
|
mousePoint.y = CGDisplayPixelsHigh(kCGDirectMainDisplay) - mousePoint.y; // Normalize y coordinate to top-left of main display.
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mousePoint = event.locationInWindow;
|
||||||
|
mousePoint = [view convertPoint:mousePoint fromView:nil]; // Convert to local coordinates of view
|
||||||
|
CGSize size = view.bounds.size;
|
||||||
|
mousePoint.y = size.height - mousePoint.y;
|
||||||
|
}
|
||||||
|
|
||||||
io.AddMousePosEvent((float)mousePoint.x, (float)mousePoint.y);
|
io.AddMousePosEvent((float)mousePoint.x, (float)mousePoint.y);
|
||||||
|
return io.WantCaptureMouse;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (event.type == NSEventTypeScrollWheel)
|
if (event.type == NSEventTypeScrollWheel)
|
||||||
@ -745,3 +766,307 @@ static void ImGui_ImplOSX_AddTrackingArea(NSView* _Nonnull view)
|
|||||||
return event;
|
return event;
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------------
|
||||||
|
// MULTI-VIEWPORT / PLATFORM INTERFACE SUPPORT
|
||||||
|
// This is an _advanced_ and _optional_ feature, allowing the back-end to create and handle multiple viewports simultaneously.
|
||||||
|
// If you are new to dear imgui or creating a new binding for dear imgui, it is recommended that you completely ignore this section first..
|
||||||
|
//--------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
struct ImGuiViewportDataOSX
|
||||||
|
{
|
||||||
|
NSWindow* Window;
|
||||||
|
bool WindowOwned;
|
||||||
|
|
||||||
|
ImGuiViewportDataOSX() { WindowOwned = false; }
|
||||||
|
~ImGuiViewportDataOSX() { IM_ASSERT(Window == nil); }
|
||||||
|
};
|
||||||
|
|
||||||
|
@interface ImGui_ImplOSX_Window: NSWindow
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation ImGui_ImplOSX_Window
|
||||||
|
|
||||||
|
- (BOOL)canBecomeKeyWindow
|
||||||
|
{
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
static void ConvertNSRect(NSScreen* screen, NSRect* r)
|
||||||
|
{
|
||||||
|
r->origin.y = CGDisplayPixelsHigh(kCGDirectMainDisplay) - r->origin.y - r->size.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplOSX_CreateWindow(ImGuiViewport* viewport)
|
||||||
|
{
|
||||||
|
ImGui_ImplOSX_Data* bd = ImGui_ImplOSX_GetBackendData();
|
||||||
|
ImGuiViewportDataOSX* data = IM_NEW(ImGuiViewportDataOSX)();
|
||||||
|
viewport->PlatformUserData = data;
|
||||||
|
|
||||||
|
NSScreen* screen = bd->Window.screen;
|
||||||
|
NSRect rect = NSMakeRect(viewport->Pos.x, viewport->Pos.y, viewport->Size.x, viewport->Size.y);
|
||||||
|
ConvertNSRect(screen, &rect);
|
||||||
|
|
||||||
|
NSWindowStyleMask styleMask = 0;
|
||||||
|
if (viewport->Flags & ImGuiViewportFlags_NoDecoration)
|
||||||
|
styleMask |= NSWindowStyleMaskBorderless;
|
||||||
|
else
|
||||||
|
styleMask |= NSWindowStyleMaskTitled | NSWindowStyleMaskResizable | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable;
|
||||||
|
|
||||||
|
NSWindow* window = [[ImGui_ImplOSX_Window alloc] initWithContentRect:rect
|
||||||
|
styleMask:styleMask
|
||||||
|
backing:NSBackingStoreBuffered
|
||||||
|
defer:YES
|
||||||
|
screen:screen];
|
||||||
|
if (viewport->Flags & ImGuiViewportFlags_TopMost)
|
||||||
|
[window setLevel:NSFloatingWindowLevel];
|
||||||
|
|
||||||
|
window.title = @"Untitled";
|
||||||
|
window.opaque = YES;
|
||||||
|
if (viewport->Flags & ImGuiViewportFlags_NoFocusOnAppearing)
|
||||||
|
[window orderFront:nil];
|
||||||
|
else
|
||||||
|
[window makeKeyAndOrderFront:nil];
|
||||||
|
|
||||||
|
[window setIsVisible:YES];
|
||||||
|
|
||||||
|
KeyEventResponder* view = [[KeyEventResponder alloc] initWithFrame:rect];
|
||||||
|
if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6)
|
||||||
|
[view setWantsBestResolutionOpenGLSurface:YES];
|
||||||
|
|
||||||
|
window.contentView = view;
|
||||||
|
|
||||||
|
data->Window = window;
|
||||||
|
data->WindowOwned = true;
|
||||||
|
viewport->PlatformRequestResize = false;
|
||||||
|
viewport->PlatformHandle = viewport->PlatformHandleRaw = (__bridge_retained void*)window;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplOSX_DestroyWindow(ImGuiViewport* viewport)
|
||||||
|
{
|
||||||
|
NSWindow* window = (__bridge_transfer NSWindow*)viewport->PlatformHandleRaw;
|
||||||
|
window = nil;
|
||||||
|
|
||||||
|
if (ImGuiViewportDataOSX* data = (ImGuiViewportDataOSX*)viewport->PlatformUserData)
|
||||||
|
{
|
||||||
|
NSWindow* window = data->Window;
|
||||||
|
if (window != nil && data->WindowOwned)
|
||||||
|
{
|
||||||
|
window.contentView = nil;
|
||||||
|
window.contentViewController = nil;
|
||||||
|
[window orderOut:nil];
|
||||||
|
}
|
||||||
|
data->Window = nil;
|
||||||
|
IM_DELETE(data);
|
||||||
|
}
|
||||||
|
viewport->PlatformUserData = viewport->PlatformHandle = viewport->PlatformHandleRaw = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplOSX_ShowWindow(ImGuiViewport* viewport)
|
||||||
|
{
|
||||||
|
ImGuiViewportDataOSX* data = (ImGuiViewportDataOSX*)viewport->PlatformUserData;
|
||||||
|
IM_ASSERT(data->Window != nil);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplOSX_UpdateWindow(ImGuiViewport* viewport)
|
||||||
|
{
|
||||||
|
ImGuiViewportDataOSX* data = (ImGuiViewportDataOSX*)viewport->PlatformUserData;
|
||||||
|
IM_ASSERT(data->Window != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ImVec2 ImGui_ImplOSX_GetWindowPos(ImGuiViewport* viewport)
|
||||||
|
{
|
||||||
|
ImGuiViewportDataOSX* data = (ImGuiViewportDataOSX*)viewport->PlatformUserData;
|
||||||
|
IM_ASSERT(data->Window != 0);
|
||||||
|
|
||||||
|
NSWindow* window = data->Window;
|
||||||
|
NSScreen* screen = window.screen;
|
||||||
|
NSSize size = screen.frame.size;
|
||||||
|
NSRect frame = window.frame;
|
||||||
|
NSRect rect = window.contentLayoutRect;
|
||||||
|
return ImVec2(frame.origin.x, size.height - frame.origin.y - rect.size.height);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplOSX_SetWindowPos(ImGuiViewport* viewport, ImVec2 pos)
|
||||||
|
{
|
||||||
|
ImGuiViewportDataOSX* data = (ImGuiViewportDataOSX*)viewport->PlatformUserData;
|
||||||
|
IM_ASSERT(data->Window != 0);
|
||||||
|
|
||||||
|
NSWindow* window = data->Window;
|
||||||
|
NSSize size = window.frame.size;
|
||||||
|
|
||||||
|
NSRect r = NSMakeRect(pos.x, pos.y, size.width, size.height);
|
||||||
|
ConvertNSRect(window.screen, &r);
|
||||||
|
[window setFrameOrigin:r.origin];
|
||||||
|
}
|
||||||
|
|
||||||
|
static ImVec2 ImGui_ImplOSX_GetWindowSize(ImGuiViewport* viewport)
|
||||||
|
{
|
||||||
|
ImGuiViewportDataOSX* data = (ImGuiViewportDataOSX*)viewport->PlatformUserData;
|
||||||
|
IM_ASSERT(data->Window != 0);
|
||||||
|
|
||||||
|
NSWindow* window = data->Window;
|
||||||
|
NSSize size = window.contentLayoutRect.size;
|
||||||
|
return ImVec2(size.width, size.width);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplOSX_SetWindowSize(ImGuiViewport* viewport, ImVec2 size)
|
||||||
|
{
|
||||||
|
ImGuiViewportDataOSX* data = (ImGuiViewportDataOSX*)viewport->PlatformUserData;
|
||||||
|
IM_ASSERT(data->Window != 0);
|
||||||
|
|
||||||
|
NSWindow* window = data->Window;
|
||||||
|
NSRect rect = window.frame;
|
||||||
|
rect.origin.y -= (size.y - rect.size.height);
|
||||||
|
rect.size.width = size.x;
|
||||||
|
rect.size.height = size.y;
|
||||||
|
[window setFrame:rect display:YES];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplOSX_SetWindowFocus(ImGuiViewport* viewport)
|
||||||
|
{
|
||||||
|
ImGui_ImplOSX_Data* bd = ImGui_ImplOSX_GetBackendData();
|
||||||
|
ImGuiViewportDataOSX* data = (ImGuiViewportDataOSX*)viewport->PlatformUserData;
|
||||||
|
IM_ASSERT(data->Window != 0);
|
||||||
|
[data->Window makeKeyAndOrderFront:bd->Window];
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ImGui_ImplOSX_GetWindowFocus(ImGuiViewport* viewport)
|
||||||
|
{
|
||||||
|
ImGuiViewportDataOSX* data = (ImGuiViewportDataOSX*)viewport->PlatformUserData;
|
||||||
|
IM_ASSERT(data->Window != 0);
|
||||||
|
|
||||||
|
return data->Window.isKeyWindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool ImGui_ImplOSX_GetWindowMinimized(ImGuiViewport* viewport)
|
||||||
|
{
|
||||||
|
ImGuiViewportDataOSX* data = (ImGuiViewportDataOSX*)viewport->PlatformUserData;
|
||||||
|
IM_ASSERT(data->Window != 0);
|
||||||
|
|
||||||
|
return data->Window.isMiniaturized;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplOSX_SetWindowTitle(ImGuiViewport* viewport, const char* title)
|
||||||
|
{
|
||||||
|
ImGuiViewportDataOSX* data = (ImGuiViewportDataOSX*)viewport->PlatformUserData;
|
||||||
|
IM_ASSERT(data->Window != 0);
|
||||||
|
|
||||||
|
data->Window.title = [NSString stringWithUTF8String:title];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplOSX_SetWindowAlpha(ImGuiViewport* viewport, float alpha)
|
||||||
|
{
|
||||||
|
ImGuiViewportDataOSX* data = (ImGuiViewportDataOSX*)viewport->PlatformUserData;
|
||||||
|
IM_ASSERT(data->Window != 0);
|
||||||
|
IM_ASSERT(alpha >= 0.0f && alpha <= 1.0f);
|
||||||
|
|
||||||
|
data->Window.alphaValue = alpha;
|
||||||
|
}
|
||||||
|
|
||||||
|
static float ImGui_ImplOSX_GetWindowDpiScale(ImGuiViewport* viewport)
|
||||||
|
{
|
||||||
|
ImGuiViewportDataOSX* data = (ImGuiViewportDataOSX*)viewport->PlatformUserData;
|
||||||
|
IM_ASSERT(data->Window != 0);
|
||||||
|
|
||||||
|
return data->Window.backingScaleFactor;
|
||||||
|
}
|
||||||
|
|
||||||
|
// FIXME-DPI: Testing DPI related ideas
|
||||||
|
static void ImGui_ImplOSX_OnChangedViewport(ImGuiViewport* viewport)
|
||||||
|
{
|
||||||
|
(void)viewport;
|
||||||
|
#if 0
|
||||||
|
ImGuiStyle default_style;
|
||||||
|
//default_style.WindowPadding = ImVec2(0, 0);
|
||||||
|
//default_style.WindowBorderSize = 0.0f;
|
||||||
|
//default_style.ItemSpacing.y = 3.0f;
|
||||||
|
//default_style.FramePadding = ImVec2(0, 0);
|
||||||
|
default_style.ScaleAllSizes(viewport->DpiScale);
|
||||||
|
ImGuiStyle& style = ImGui::GetStyle();
|
||||||
|
style = default_style;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplOSX_UpdateMonitors()
|
||||||
|
{
|
||||||
|
ImGui::GetPlatformIO().Monitors.resize(static_cast<int>(NSScreen.screens.count));
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
for (NSScreen* screen in NSScreen.screens)
|
||||||
|
{
|
||||||
|
NSRect frame = screen.frame;
|
||||||
|
NSRect visibleFrame = screen.visibleFrame;
|
||||||
|
|
||||||
|
ImGuiPlatformMonitor imgui_monitor;
|
||||||
|
imgui_monitor.MainPos = ImVec2(frame.origin.x, frame.origin.y);
|
||||||
|
imgui_monitor.MainSize = ImVec2(frame.size.width, frame.size.height);
|
||||||
|
imgui_monitor.WorkPos = ImVec2(visibleFrame.origin.x, visibleFrame.origin.y);
|
||||||
|
imgui_monitor.WorkSize = ImVec2(visibleFrame.size.width, visibleFrame.size.height);
|
||||||
|
imgui_monitor.DpiScale = screen.backingScaleFactor;
|
||||||
|
|
||||||
|
ImGuiPlatformIO& io = ImGui::GetPlatformIO();
|
||||||
|
io.Monitors[i] = imgui_monitor;
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplOSX_InitPlatformInterface()
|
||||||
|
{
|
||||||
|
ImGui_ImplOSX_Data* bd = ImGui_ImplOSX_GetBackendData();
|
||||||
|
ImGui_ImplOSX_UpdateMonitors();
|
||||||
|
|
||||||
|
// Register platform interface (will be coupled with a renderer interface)
|
||||||
|
ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
||||||
|
platform_io.Platform_CreateWindow = ImGui_ImplOSX_CreateWindow;
|
||||||
|
platform_io.Platform_DestroyWindow = ImGui_ImplOSX_DestroyWindow;
|
||||||
|
platform_io.Platform_ShowWindow = ImGui_ImplOSX_ShowWindow;
|
||||||
|
platform_io.Platform_SetWindowPos = ImGui_ImplOSX_SetWindowPos;
|
||||||
|
platform_io.Platform_GetWindowPos = ImGui_ImplOSX_GetWindowPos;
|
||||||
|
platform_io.Platform_SetWindowSize = ImGui_ImplOSX_SetWindowSize;
|
||||||
|
platform_io.Platform_GetWindowSize = ImGui_ImplOSX_GetWindowSize;
|
||||||
|
platform_io.Platform_SetWindowFocus = ImGui_ImplOSX_SetWindowFocus;
|
||||||
|
platform_io.Platform_GetWindowFocus = ImGui_ImplOSX_GetWindowFocus;
|
||||||
|
platform_io.Platform_GetWindowMinimized = ImGui_ImplOSX_GetWindowMinimized;
|
||||||
|
platform_io.Platform_SetWindowTitle = ImGui_ImplOSX_SetWindowTitle;
|
||||||
|
platform_io.Platform_SetWindowAlpha = ImGui_ImplOSX_SetWindowAlpha;
|
||||||
|
platform_io.Platform_UpdateWindow = ImGui_ImplOSX_UpdateWindow;
|
||||||
|
platform_io.Platform_GetWindowDpiScale = ImGui_ImplOSX_GetWindowDpiScale; // FIXME-DPI
|
||||||
|
platform_io.Platform_OnChangedViewport = ImGui_ImplOSX_OnChangedViewport; // FIXME-DPI
|
||||||
|
|
||||||
|
// Register main window handle (which is owned by the main application, not by us)
|
||||||
|
ImGuiViewport* main_viewport = ImGui::GetMainViewport();
|
||||||
|
ImGuiViewportDataOSX* data = IM_NEW(ImGuiViewportDataOSX)();
|
||||||
|
data->Window = bd->Window;
|
||||||
|
data->WindowOwned = false;
|
||||||
|
main_viewport->PlatformUserData = data;
|
||||||
|
main_viewport->PlatformHandle = (__bridge void*)bd->Window;
|
||||||
|
|
||||||
|
[NSNotificationCenter.defaultCenter addObserver:bd->Observer
|
||||||
|
selector:@selector(displaysDidChange:)
|
||||||
|
name:NSApplicationDidChangeScreenParametersNotification
|
||||||
|
object:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ImGui_ImplOSX_ShutdownPlatformInterface()
|
||||||
|
{
|
||||||
|
ImGui_ImplOSX_Data* bd = ImGui_ImplOSX_GetBackendData();
|
||||||
|
[NSNotificationCenter.defaultCenter removeObserver:bd->Observer
|
||||||
|
name:NSApplicationDidChangeScreenParametersNotification
|
||||||
|
object:nil];
|
||||||
|
bd->Observer = NULL;
|
||||||
|
bd->Window = NULL;
|
||||||
|
if (bd->Monitor != NULL)
|
||||||
|
{
|
||||||
|
[NSEvent removeMonitor:bd->Monitor];
|
||||||
|
bd->Monitor = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGuiViewport* main_viewport = ImGui::GetMainViewport();
|
||||||
|
ImGuiViewportDataOSX* data = (ImGuiViewportDataOSX*)main_viewport->PlatformUserData;
|
||||||
|
IM_DELETE(data);
|
||||||
|
main_viewport->PlatformUserData = NULL;
|
||||||
|
ImGui::DestroyPlatformWindows();
|
||||||
|
}
|
||||||
|
@ -175,6 +175,7 @@ Other Changes:
|
|||||||
- Backends: OSX: Monitor NSKeyUp events to catch missing keyUp for key when user press Cmd + key (#5128) [@thedmd]
|
- Backends: OSX: Monitor NSKeyUp events to catch missing keyUp for key when user press Cmd + key (#5128) [@thedmd]
|
||||||
- Backends: OSX, Metal: Store backend data in a per-context struct, allowing to use these backends with
|
- Backends: OSX, Metal: Store backend data in a per-context struct, allowing to use these backends with
|
||||||
multiple contexts. (#5203, #5221, #4141) [@noisewuwei]
|
multiple contexts. (#5203, #5221, #4141) [@noisewuwei]
|
||||||
|
- Backends: OSX, Metal: Implemented support for viewports / platform windows. [@stuartcarnie]
|
||||||
- Examples: Emscripten+WebGPU: Fix building for latest WebGPU specs. (#3632)
|
- Examples: Emscripten+WebGPU: Fix building for latest WebGPU specs. (#3632)
|
||||||
- Examples: OSX+Metal, OSX+OpenGL: Removed now-unnecessary calls to ImGui_ImplOSX_HandleEvent(). (#4821)
|
- Examples: OSX+Metal, OSX+OpenGL: Removed now-unnecessary calls to ImGui_ImplOSX_HandleEvent(). (#4821)
|
||||||
|
|
||||||
|
@ -7,7 +7,10 @@
|
|||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
|
050450AB2768052600AB6805 /* imgui_tables.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5079822D257677DB0038A28D /* imgui_tables.cpp */; };
|
||||||
|
050450AD276863B000AB6805 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 050450AC276863B000AB6805 /* QuartzCore.framework */; };
|
||||||
05318E0F274C397200A8DE2E /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05318E0E274C397200A8DE2E /* GameController.framework */; };
|
05318E0F274C397200A8DE2E /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05318E0E274C397200A8DE2E /* GameController.framework */; };
|
||||||
|
05A275442773BEA20084EF39 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05A275432773BEA20084EF39 /* QuartzCore.framework */; };
|
||||||
07A82ED82139413D0078D120 /* imgui_widgets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07A82ED72139413C0078D120 /* imgui_widgets.cpp */; };
|
07A82ED82139413D0078D120 /* imgui_widgets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07A82ED72139413C0078D120 /* imgui_widgets.cpp */; };
|
||||||
07A82ED92139418F0078D120 /* imgui_widgets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07A82ED72139413C0078D120 /* imgui_widgets.cpp */; };
|
07A82ED92139418F0078D120 /* imgui_widgets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07A82ED72139413C0078D120 /* imgui_widgets.cpp */; };
|
||||||
5079822E257677DB0038A28D /* imgui_tables.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5079822D257677DB0038A28D /* imgui_tables.cpp */; };
|
5079822E257677DB0038A28D /* imgui_tables.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5079822D257677DB0038A28D /* imgui_tables.cpp */; };
|
||||||
@ -33,7 +36,11 @@
|
|||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
|
050450AC276863B000AB6805 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
|
||||||
05318E0E274C397200A8DE2E /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = System/Library/Frameworks/GameController.framework; sourceTree = SDKROOT; };
|
05318E0E274C397200A8DE2E /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = System/Library/Frameworks/GameController.framework; sourceTree = SDKROOT; };
|
||||||
|
05A2754027728F5B0084EF39 /* imgui_impl_metal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui_impl_metal.h; path = ../../backends/imgui_impl_metal.h; sourceTree = "<group>"; };
|
||||||
|
05A2754127728F5B0084EF39 /* imgui_impl_osx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui_impl_osx.h; path = ../../backends/imgui_impl_osx.h; sourceTree = "<group>"; };
|
||||||
|
05A275432773BEA20084EF39 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS15.2.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
|
||||||
07A82ED62139413C0078D120 /* imgui_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui_internal.h; path = ../../imgui_internal.h; sourceTree = "<group>"; };
|
07A82ED62139413C0078D120 /* imgui_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui_internal.h; path = ../../imgui_internal.h; sourceTree = "<group>"; };
|
||||||
07A82ED72139413C0078D120 /* imgui_widgets.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_widgets.cpp; path = ../../imgui_widgets.cpp; sourceTree = "<group>"; };
|
07A82ED72139413C0078D120 /* imgui_widgets.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_widgets.cpp; path = ../../imgui_widgets.cpp; sourceTree = "<group>"; };
|
||||||
5079822D257677DB0038A28D /* imgui_tables.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_tables.cpp; path = ../../imgui_tables.cpp; sourceTree = "<group>"; };
|
5079822D257677DB0038A28D /* imgui_tables.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_tables.cpp; path = ../../imgui_tables.cpp; sourceTree = "<group>"; };
|
||||||
@ -66,6 +73,7 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
05A275442773BEA20084EF39 /* QuartzCore.framework in Frameworks */,
|
||||||
8309BD8F253CCAAA0045E2A1 /* UIKit.framework in Frameworks */,
|
8309BD8F253CCAAA0045E2A1 /* UIKit.framework in Frameworks */,
|
||||||
83BBE9E720EB46BD00295997 /* MetalKit.framework in Frameworks */,
|
83BBE9E720EB46BD00295997 /* MetalKit.framework in Frameworks */,
|
||||||
83BBE9E520EB46B900295997 /* Metal.framework in Frameworks */,
|
83BBE9E520EB46B900295997 /* Metal.framework in Frameworks */,
|
||||||
@ -76,6 +84,7 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
050450AD276863B000AB6805 /* QuartzCore.framework in Frameworks */,
|
||||||
8309BDC6253CCCFE0045E2A1 /* AppKit.framework in Frameworks */,
|
8309BDC6253CCCFE0045E2A1 /* AppKit.framework in Frameworks */,
|
||||||
83BBE9EC20EB471700295997 /* MetalKit.framework in Frameworks */,
|
83BBE9EC20EB471700295997 /* MetalKit.framework in Frameworks */,
|
||||||
05318E0F274C397200A8DE2E /* GameController.framework in Frameworks */,
|
05318E0F274C397200A8DE2E /* GameController.framework in Frameworks */,
|
||||||
@ -136,6 +145,8 @@
|
|||||||
83BBE9E320EB46B800295997 /* Frameworks */ = {
|
83BBE9E320EB46B800295997 /* Frameworks */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
050450AC276863B000AB6805 /* QuartzCore.framework */,
|
||||||
|
05A275432773BEA20084EF39 /* QuartzCore.framework */,
|
||||||
05318E0E274C397200A8DE2E /* GameController.framework */,
|
05318E0E274C397200A8DE2E /* GameController.framework */,
|
||||||
8309BDC5253CCCFE0045E2A1 /* AppKit.framework */,
|
8309BDC5253CCCFE0045E2A1 /* AppKit.framework */,
|
||||||
8309BD8E253CCAAA0045E2A1 /* UIKit.framework */,
|
8309BD8E253CCAAA0045E2A1 /* UIKit.framework */,
|
||||||
@ -153,7 +164,9 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
5079822D257677DB0038A28D /* imgui_tables.cpp */,
|
5079822D257677DB0038A28D /* imgui_tables.cpp */,
|
||||||
|
05A2754027728F5B0084EF39 /* imgui_impl_metal.h */,
|
||||||
8309BDB5253CCC9D0045E2A1 /* imgui_impl_metal.mm */,
|
8309BDB5253CCC9D0045E2A1 /* imgui_impl_metal.mm */,
|
||||||
|
05A2754127728F5B0084EF39 /* imgui_impl_osx.h */,
|
||||||
8309BDB6253CCC9D0045E2A1 /* imgui_impl_osx.mm */,
|
8309BDB6253CCC9D0045E2A1 /* imgui_impl_osx.mm */,
|
||||||
83BBEA0420EB54E700295997 /* imconfig.h */,
|
83BBEA0420EB54E700295997 /* imconfig.h */,
|
||||||
83BBEA0320EB54E700295997 /* imgui.cpp */,
|
83BBEA0320EB54E700295997 /* imgui.cpp */,
|
||||||
@ -284,7 +297,7 @@
|
|||||||
83BBEA0A20EB54E700295997 /* imgui.cpp in Sources */,
|
83BBEA0A20EB54E700295997 /* imgui.cpp in Sources */,
|
||||||
83BBEA0820EB54E700295997 /* imgui_demo.cpp in Sources */,
|
83BBEA0820EB54E700295997 /* imgui_demo.cpp in Sources */,
|
||||||
83BBEA0620EB54E700295997 /* imgui_draw.cpp in Sources */,
|
83BBEA0620EB54E700295997 /* imgui_draw.cpp in Sources */,
|
||||||
5079822E257677DB0038A28D /* imgui_tables.cpp in Sources */,
|
050450AB2768052600AB6805 /* imgui_tables.cpp in Sources */,
|
||||||
07A82ED92139418F0078D120 /* imgui_widgets.cpp in Sources */,
|
07A82ED92139418F0078D120 /* imgui_widgets.cpp in Sources */,
|
||||||
8309BDA8253CCC080045E2A1 /* main.mm in Sources */,
|
8309BDA8253CCC080045E2A1 /* main.mm in Sources */,
|
||||||
);
|
);
|
||||||
|
@ -56,11 +56,21 @@
|
|||||||
ImGuiIO& io = ImGui::GetIO(); (void)io;
|
ImGuiIO& io = ImGui::GetIO(); (void)io;
|
||||||
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
|
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
|
||||||
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
|
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
|
||||||
|
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // Enable Docking
|
||||||
|
io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; // Enable Multi-Viewport / Platform Windows
|
||||||
|
|
||||||
// Setup Dear ImGui style
|
// Setup Dear ImGui style
|
||||||
ImGui::StyleColorsDark();
|
ImGui::StyleColorsDark();
|
||||||
//ImGui::StyleColorsClassic();
|
//ImGui::StyleColorsClassic();
|
||||||
|
|
||||||
|
// When viewports are enabled we tweak WindowRounding/WindowBg so platform windows can look identical to regular ones.
|
||||||
|
ImGuiStyle& style = ImGui::GetStyle();
|
||||||
|
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
|
||||||
|
{
|
||||||
|
style.WindowRounding = 0.0f;
|
||||||
|
style.Colors[ImGuiCol_WindowBg].w = 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
// Setup Renderer backend
|
// Setup Renderer backend
|
||||||
ImGui_ImplMetal_Init(_device);
|
ImGui_ImplMetal_Init(_device);
|
||||||
|
|
||||||
@ -190,6 +200,13 @@
|
|||||||
// Present
|
// Present
|
||||||
[commandBuffer presentDrawable:view.currentDrawable];
|
[commandBuffer presentDrawable:view.currentDrawable];
|
||||||
[commandBuffer commit];
|
[commandBuffer commit];
|
||||||
|
|
||||||
|
// Update and Render additional Platform Windows
|
||||||
|
if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable)
|
||||||
|
{
|
||||||
|
ImGui::UpdatePlatformWindows();
|
||||||
|
ImGui::RenderPlatformWindowsDefault();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
-(void)mtkView:(MTKView*)view drawableSizeWillChange:(CGSize)size
|
-(void)mtkView:(MTKView*)view drawableSizeWillChange:(CGSize)size
|
||||||
|
Loading…
Reference in New Issue
Block a user