2017-04-14 12:00:05 -04:00
|
|
|
/*
|
2017-06-22 14:53:49 -04:00
|
|
|
* DemoViewController.mm
|
2017-04-14 12:00:05 -04:00
|
|
|
*
|
2017-06-22 14:53:49 -04:00
|
|
|
* Copyright (c) 2016-2017 The Brenwill Workshop Ltd.
|
|
|
|
|
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
|
2017-04-14 12:00:05 -04:00
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#import "DemoViewController.h"
|
|
|
|
|
|
2017-06-22 14:53:49 -04:00
|
|
|
#include "MVKExample.h"
|
2017-04-14 12:00:05 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
const std::string VulkanExampleBase::getAssetPath() {
|
|
|
|
|
return [NSBundle.mainBundle.resourcePath stringByAppendingString: @"/data/"].UTF8String;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#pragma mark -
|
|
|
|
|
#pragma mark DemoViewController
|
|
|
|
|
|
|
|
|
|
@implementation DemoViewController {
|
2017-06-22 14:53:49 -04:00
|
|
|
MVKExample* _mvkExample;
|
2017-04-14 12:00:05 -04:00
|
|
|
CADisplayLink* _displayLink;
|
2017-06-05 16:26:29 -04:00
|
|
|
BOOL _viewHasAppeared;
|
2017-04-14 12:00:05 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** Since this is a single-view app, init Vulkan when the view is loaded. */
|
|
|
|
|
-(void) viewDidLoad {
|
|
|
|
|
[super viewDidLoad];
|
|
|
|
|
|
2017-06-05 16:26:29 -04:00
|
|
|
self.view.contentScaleFactor = UIScreen.mainScreen.nativeScale;
|
|
|
|
|
|
2017-06-22 14:53:49 -04:00
|
|
|
_mvkExample = new MVKExample(self.view);
|
2017-04-14 12:00:05 -04:00
|
|
|
|
|
|
|
|
uint32_t fps = 60;
|
|
|
|
|
_displayLink = [CADisplayLink displayLinkWithTarget: self selector: @selector(renderFrame)];
|
|
|
|
|
[_displayLink setFrameInterval: 60 / fps];
|
|
|
|
|
[_displayLink addToRunLoop: NSRunLoop.currentRunLoop forMode: NSDefaultRunLoopMode];
|
2017-06-05 16:26:29 -04:00
|
|
|
|
|
|
|
|
// Setup tap gesture to toggle virtual keyboard
|
|
|
|
|
UITapGestureRecognizer* tapSelector = [[UITapGestureRecognizer alloc]
|
|
|
|
|
initWithTarget: self action: @selector(handleTapGesture:)];
|
|
|
|
|
tapSelector.numberOfTapsRequired = 1;
|
|
|
|
|
tapSelector.cancelsTouchesInView = YES;
|
|
|
|
|
[self.view addGestureRecognizer: tapSelector];
|
|
|
|
|
|
|
|
|
|
_viewHasAppeared = NO;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
-(void) viewDidAppear: (BOOL) animated {
|
|
|
|
|
[super viewDidAppear: animated];
|
|
|
|
|
_viewHasAppeared = YES;
|
2017-04-14 12:00:05 -04:00
|
|
|
}
|
|
|
|
|
|
2017-06-05 16:26:29 -04:00
|
|
|
-(BOOL) canBecomeFirstResponder { return _viewHasAppeared; }
|
|
|
|
|
|
2017-04-14 12:00:05 -04:00
|
|
|
-(void) renderFrame {
|
2017-06-22 14:53:49 -04:00
|
|
|
_mvkExample->renderFrame();
|
2017-04-14 12:00:05 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
-(void) dealloc {
|
2017-06-22 14:53:49 -04:00
|
|
|
delete _mvkExample;
|
2017-04-14 12:00:05 -04:00
|
|
|
[super dealloc];
|
|
|
|
|
}
|
|
|
|
|
|
2017-06-05 16:26:29 -04:00
|
|
|
// Toggle the display of the virtual keyboard
|
|
|
|
|
-(void) toggleKeyboard {
|
|
|
|
|
if (self.isFirstResponder) {
|
|
|
|
|
[self resignFirstResponder];
|
|
|
|
|
} else {
|
|
|
|
|
[self becomeFirstResponder];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Display and hide the keyboard by tapping on the view
|
|
|
|
|
-(void) handleTapGesture: (UITapGestureRecognizer*) gestureRecognizer {
|
|
|
|
|
if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {
|
|
|
|
|
[self toggleKeyboard];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Handle keyboard input
|
|
|
|
|
-(void) handleKeyboardInput: (unichar) keycode {
|
2017-06-22 14:53:49 -04:00
|
|
|
_mvkExample->keyPressed(keycode);
|
2017-06-05 16:26:29 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#pragma mark UIKeyInput methods
|
|
|
|
|
|
|
|
|
|
// Returns whether text is available
|
|
|
|
|
-(BOOL) hasText { return YES; }
|
|
|
|
|
|
|
|
|
|
// A key on the keyboard has been pressed.
|
|
|
|
|
-(void) insertText: (NSString*) text {
|
|
|
|
|
unichar keycode = (text.length > 0) ? [text characterAtIndex: 0] : 0;
|
|
|
|
|
[self handleKeyboardInput: keycode];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// The delete backward key has been pressed.
|
|
|
|
|
-(void) deleteBackward {
|
|
|
|
|
[self handleKeyboardInput: 0x33];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2017-04-14 12:00:05 -04:00
|
|
|
@end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#pragma mark -
|
|
|
|
|
#pragma mark DemoView
|
|
|
|
|
|
|
|
|
|
@implementation DemoView
|
|
|
|
|
|
|
|
|
|
/** Returns a Metal-compatible layer. */
|
|
|
|
|
+(Class) layerClass { return [CAMetalLayer class]; }
|
|
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
|