You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
		
		
		
		
		
			
		
			
				
					
					
						
							130 lines
						
					
					
						
							4.2 KiB
						
					
					
				
			
		
		
	
	
							130 lines
						
					
					
						
							4.2 KiB
						
					
					
				 | 
						|
#import "ViewController.h" | 
						|
#import "Renderer.h" | 
						|
#include "imgui.h" | 
						|
 | 
						|
#if TARGET_OS_OSX | 
						|
#include "imgui_impl_osx.h" | 
						|
#endif | 
						|
 | 
						|
@interface ViewController () | 
						|
@property (nonatomic, readonly) MTKView *mtkView; | 
						|
@property (nonatomic, strong) Renderer *renderer; | 
						|
@end | 
						|
 | 
						|
@implementation ViewController | 
						|
 | 
						|
- (MTKView *)mtkView { | 
						|
    return (MTKView *)self.view; | 
						|
} | 
						|
 | 
						|
- (void)viewDidLoad | 
						|
{ | 
						|
    [super viewDidLoad]; | 
						|
     | 
						|
    self.mtkView.device = MTLCreateSystemDefaultDevice(); | 
						|
     | 
						|
    if (!self.mtkView.device) { | 
						|
        NSLog(@"Metal is not supported"); | 
						|
        abort(); | 
						|
    } | 
						|
 | 
						|
    self.renderer = [[Renderer alloc] initWithView:self.mtkView]; | 
						|
 | 
						|
    [self.renderer mtkView:self.mtkView drawableSizeWillChange:self.mtkView.bounds.size]; | 
						|
 | 
						|
    self.mtkView.delegate = self.renderer; | 
						|
 | 
						|
#if TARGET_OS_OSX | 
						|
    // Add a tracking area in order to receive mouse events whenever the mouse is within the bounds of our view | 
						|
    NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:NSZeroRect | 
						|
                                                                options:NSTrackingMouseMoved | NSTrackingInVisibleRect | NSTrackingActiveAlways | 
						|
                                                                  owner:self | 
						|
                                                               userInfo:nil]; | 
						|
    [self.view addTrackingArea:trackingArea]; | 
						|
     | 
						|
    // If we want to receive key events, we either need to be in the responder chain of the key view, | 
						|
    // or else we can install a local monitor. The consequence of this heavy-handed approach is that | 
						|
    // we receive events for all controls, not just Dear ImGui widgets. If we had native controls in our | 
						|
    // 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. | 
						|
    NSEventMask eventMask = NSEventMaskKeyDown | NSEventMaskKeyUp | NSEventMaskFlagsChanged | NSEventTypeScrollWheel; | 
						|
    [NSEvent addLocalMonitorForEventsMatchingMask:eventMask handler:^NSEvent * _Nullable(NSEvent *event) { | 
						|
        BOOL wantsCapture = ImGui_ImplOSX_HandleEvent(event, self.view); | 
						|
        if (event.type == NSEventTypeKeyDown && wantsCapture) { | 
						|
            return nil; | 
						|
        } else { | 
						|
            return event; | 
						|
        } | 
						|
         | 
						|
    }]; | 
						|
     | 
						|
    ImGui_ImplOSX_Init(); | 
						|
#endif | 
						|
} | 
						|
 | 
						|
#if TARGET_OS_OSX | 
						|
 | 
						|
- (void)mouseMoved:(NSEvent *)event { | 
						|
    ImGui_ImplOSX_HandleEvent(event, self.view); | 
						|
} | 
						|
 | 
						|
- (void)mouseDown:(NSEvent *)event { | 
						|
    ImGui_ImplOSX_HandleEvent(event, self.view); | 
						|
} | 
						|
 | 
						|
- (void)mouseUp:(NSEvent *)event { | 
						|
    ImGui_ImplOSX_HandleEvent(event, self.view); | 
						|
} | 
						|
 | 
						|
- (void)mouseDragged:(NSEvent *)event { | 
						|
    ImGui_ImplOSX_HandleEvent(event, self.view); | 
						|
} | 
						|
 | 
						|
- (void)scrollWheel:(NSEvent *)event { | 
						|
    ImGui_ImplOSX_HandleEvent(event, self.view); | 
						|
} | 
						|
 | 
						|
#elif TARGET_OS_IOS | 
						|
 | 
						|
// This touch mapping is super cheesy/hacky. We treat any touch on the screen | 
						|
// as if it were a depressed left mouse button, and we don't bother handling | 
						|
// multitouch correctly at all. This causes the "cursor" to behave very erratically | 
						|
// when there are multiple active touches. But for demo purposes, single-touch | 
						|
// interaction actually works surprisingly well. | 
						|
- (void)updateIOWithTouchEvent:(UIEvent *)event { | 
						|
    UITouch *anyTouch = event.allTouches.anyObject; | 
						|
    CGPoint touchLocation = [anyTouch locationInView:self.view]; | 
						|
    ImGuiIO &io = ImGui::GetIO(); | 
						|
    io.MousePos = ImVec2(touchLocation.x, touchLocation.y); | 
						|
     | 
						|
    BOOL hasActiveTouch = NO; | 
						|
    for (UITouch *touch in event.allTouches) { | 
						|
        if (touch.phase != UITouchPhaseEnded && touch.phase != UITouchPhaseCancelled) { | 
						|
            hasActiveTouch = YES; | 
						|
            break; | 
						|
        } | 
						|
    } | 
						|
    io.MouseDown[0] = hasActiveTouch; | 
						|
} | 
						|
 | 
						|
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { | 
						|
    [self updateIOWithTouchEvent:event]; | 
						|
} | 
						|
 | 
						|
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { | 
						|
    [self updateIOWithTouchEvent:event]; | 
						|
} | 
						|
 | 
						|
- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { | 
						|
    [self updateIOWithTouchEvent:event]; | 
						|
} | 
						|
 | 
						|
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { | 
						|
    [self updateIOWithTouchEvent:event]; | 
						|
} | 
						|
 | 
						|
#endif | 
						|
 | 
						|
@end | 
						|
 | 
						|
 |