procedural-3d-engine/apple/ios/DemoViewController.mm

239 lines
7 KiB
Text
Raw Normal View History

Add updated iOS App support to the Vulkan examples (#1119) * Fix clang Objective-C++ flags for macOS command line builds * Fix getAssetPath() and getShaderBasePath() for macOS command line builds * Protect debugUtilsMessageCallback() from failing when pMessageIdName is NULL * Fix a few clang function override and mismatched type warnings * Fix validation layer warnings on exit for computeraytracing example * Fix regression in text visibility toggle for textOverlay example * Support VK_USE_PLATFORM_METAL_EXT vs. deprecated VK_USE_PLATFORM_MACOS_MVK / DVK_USE_PLATFORM_IOS_MVK * Check dynamic state features before enabling capabilities in dynamicstate example * Fix vkCmdDraw() vertexCount argument (PARTICLE_COUNT) in particlesystem example * Update examples list and restore benchmarking script (to top level) * Fix validation warning in descriptorindexing example * Fix device max recursion depth validation warnings in ray tracing examples * Fix OpenMP build settings for texture3d example on all platforms * Update and simplify build instructions for macOS * Update CI script with correct library path for libomp on macOS x86_64 * Update CI scipt to install libomp prior to macOS builds * Trying one more time to get the CI script working for macOS libomp * Fix vertexCount argument using calculated size in particlesystem example * Fix combined image descriptor offset calculation in descriptorbuffer example * Add iOS App support for Vulkan examples on simulator and physical devices * Add continuous integration (CI) script for iOS * Update CI script to build iOS using Xcode 14 via macos-12 runner-image * Update iOS project docs for Xcode 14 and rename ios folder to apple * Update macOS docs and CI script to use LIBOMP_PREFIX for OpenMP library path * Delete benchmark-all-validate.py Delete benchmark script as per feedback from Sascha Willems * Update debugprintf example documentation in examples.h
2024-05-22 15:07:27 -04:00
/*
* DemoViewController.mm
*
* Copyright (c) 2016-2017 The Brenwill Workshop Ltd.
* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
*/
#import "DemoViewController.h"
#import "AppDelegate.h"
#include "MVKExample.h"
const std::string getAssetPath() {
return [NSBundle.mainBundle.resourcePath stringByAppendingString: @"/assets/"].UTF8String;
}
const std::string getShaderBasePath() {
return [NSBundle.mainBundle.resourcePath stringByAppendingString: @"/shaders/"].UTF8String;
}
CALayer* layer;
#pragma mark -
#pragma mark DemoViewController
@implementation DemoViewController {
MVKExample* _mvkExample;
CADisplayLink* _displayLink;
BOOL _viewHasAppeared;
BOOL _appInForeground;
Add updated iOS App support to the Vulkan examples (#1119) * Fix clang Objective-C++ flags for macOS command line builds * Fix getAssetPath() and getShaderBasePath() for macOS command line builds * Protect debugUtilsMessageCallback() from failing when pMessageIdName is NULL * Fix a few clang function override and mismatched type warnings * Fix validation layer warnings on exit for computeraytracing example * Fix regression in text visibility toggle for textOverlay example * Support VK_USE_PLATFORM_METAL_EXT vs. deprecated VK_USE_PLATFORM_MACOS_MVK / DVK_USE_PLATFORM_IOS_MVK * Check dynamic state features before enabling capabilities in dynamicstate example * Fix vkCmdDraw() vertexCount argument (PARTICLE_COUNT) in particlesystem example * Update examples list and restore benchmarking script (to top level) * Fix validation warning in descriptorindexing example * Fix device max recursion depth validation warnings in ray tracing examples * Fix OpenMP build settings for texture3d example on all platforms * Update and simplify build instructions for macOS * Update CI script with correct library path for libomp on macOS x86_64 * Update CI scipt to install libomp prior to macOS builds * Trying one more time to get the CI script working for macOS libomp * Fix vertexCount argument using calculated size in particlesystem example * Fix combined image descriptor offset calculation in descriptorbuffer example * Add iOS App support for Vulkan examples on simulator and physical devices * Add continuous integration (CI) script for iOS * Update CI script to build iOS using Xcode 14 via macos-12 runner-image * Update iOS project docs for Xcode 14 and rename ios folder to apple * Update macOS docs and CI script to use LIBOMP_PREFIX for OpenMP library path * Delete benchmark-all-validate.py Delete benchmark script as per feedback from Sascha Willems * Update debugprintf example documentation in examples.h
2024-05-22 15:07:27 -04:00
CGPoint _startPoint;
}
/** Since this is a single-view app, init Vulkan when the view is loaded. */
-(void) viewDidLoad {
[super viewDidLoad];
layer = [self.view layer]; // SRS - When creating a Vulkan Metal surface, need the layer backing the view
layer.contentsScale = UIScreen.mainScreen.nativeScale;
Add updated iOS App support to the Vulkan examples (#1119) * Fix clang Objective-C++ flags for macOS command line builds * Fix getAssetPath() and getShaderBasePath() for macOS command line builds * Protect debugUtilsMessageCallback() from failing when pMessageIdName is NULL * Fix a few clang function override and mismatched type warnings * Fix validation layer warnings on exit for computeraytracing example * Fix regression in text visibility toggle for textOverlay example * Support VK_USE_PLATFORM_METAL_EXT vs. deprecated VK_USE_PLATFORM_MACOS_MVK / DVK_USE_PLATFORM_IOS_MVK * Check dynamic state features before enabling capabilities in dynamicstate example * Fix vkCmdDraw() vertexCount argument (PARTICLE_COUNT) in particlesystem example * Update examples list and restore benchmarking script (to top level) * Fix validation warning in descriptorindexing example * Fix device max recursion depth validation warnings in ray tracing examples * Fix OpenMP build settings for texture3d example on all platforms * Update and simplify build instructions for macOS * Update CI script with correct library path for libomp on macOS x86_64 * Update CI scipt to install libomp prior to macOS builds * Trying one more time to get the CI script working for macOS libomp * Fix vertexCount argument using calculated size in particlesystem example * Fix combined image descriptor offset calculation in descriptorbuffer example * Add iOS App support for Vulkan examples on simulator and physical devices * Add continuous integration (CI) script for iOS * Update CI script to build iOS using Xcode 14 via macos-12 runner-image * Update iOS project docs for Xcode 14 and rename ios folder to apple * Update macOS docs and CI script to use LIBOMP_PREFIX for OpenMP library path * Delete benchmark-all-validate.py Delete benchmark script as per feedback from Sascha Willems * Update debugprintf example documentation in examples.h
2024-05-22 15:07:27 -04:00
// SRS - Calculate UI overlay scale factor based on backing layer scale factor and device type for readable UIOverlay on iOS devices
auto UIOverlayScale = layer.contentsScale * ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone ? 2.0/3.0 : 1.0 );
_mvkExample = new MVKExample(self.view, UIOverlayScale);
Add updated iOS App support to the Vulkan examples (#1119) * Fix clang Objective-C++ flags for macOS command line builds * Fix getAssetPath() and getShaderBasePath() for macOS command line builds * Protect debugUtilsMessageCallback() from failing when pMessageIdName is NULL * Fix a few clang function override and mismatched type warnings * Fix validation layer warnings on exit for computeraytracing example * Fix regression in text visibility toggle for textOverlay example * Support VK_USE_PLATFORM_METAL_EXT vs. deprecated VK_USE_PLATFORM_MACOS_MVK / DVK_USE_PLATFORM_IOS_MVK * Check dynamic state features before enabling capabilities in dynamicstate example * Fix vkCmdDraw() vertexCount argument (PARTICLE_COUNT) in particlesystem example * Update examples list and restore benchmarking script (to top level) * Fix validation warning in descriptorindexing example * Fix device max recursion depth validation warnings in ray tracing examples * Fix OpenMP build settings for texture3d example on all platforms * Update and simplify build instructions for macOS * Update CI script with correct library path for libomp on macOS x86_64 * Update CI scipt to install libomp prior to macOS builds * Trying one more time to get the CI script working for macOS libomp * Fix vertexCount argument using calculated size in particlesystem example * Fix combined image descriptor offset calculation in descriptorbuffer example * Add iOS App support for Vulkan examples on simulator and physical devices * Add continuous integration (CI) script for iOS * Update CI script to build iOS using Xcode 14 via macos-12 runner-image * Update iOS project docs for Xcode 14 and rename ios folder to apple * Update macOS docs and CI script to use LIBOMP_PREFIX for OpenMP library path * Delete benchmark-all-validate.py Delete benchmark script as per feedback from Sascha Willems * Update debugprintf example documentation in examples.h
2024-05-22 15:07:27 -04:00
// SRS - Enable AppDelegate to call into DemoViewController for handling app lifecycle events (e.g. termination)
auto appDelegate = (AppDelegate *)UIApplication.sharedApplication.delegate;
appDelegate.viewController = self;
uint32_t fps = 60;
_displayLink = [CADisplayLink displayLinkWithTarget: self selector: @selector(renderFrame)];
[_displayLink setFrameInterval: 60 / fps];
[_displayLink addToRunLoop: NSRunLoop.currentRunLoop forMode: NSDefaultRunLoopMode];
// Setup double tap gesture to toggle virtual keyboard
UITapGestureRecognizer* tapSelector = [[[UITapGestureRecognizer alloc]
initWithTarget: self action: @selector(handleTapGesture:)] autorelease];
tapSelector.numberOfTapsRequired = 2;
tapSelector.cancelsTouchesInView = YES;
tapSelector.requiresExclusiveTouchType = YES;
[self.view addGestureRecognizer: tapSelector];
// SRS - Setup pan gesture to detect and activate translation
UIPanGestureRecognizer* panSelector = [[[UIPanGestureRecognizer alloc]
initWithTarget: self action: @selector(handlePanGesture:)] autorelease];
panSelector.minimumNumberOfTouches = 2;
panSelector.cancelsTouchesInView = YES;
panSelector.requiresExclusiveTouchType = YES;
[self.view addGestureRecognizer: panSelector];
// SRS - Setup pinch gesture to detect and activate zoom
UIPinchGestureRecognizer* pinchSelector = [[[UIPinchGestureRecognizer alloc]
initWithTarget: self action: @selector(handlePinchGesture:)] autorelease];
pinchSelector.cancelsTouchesInView = YES;
pinchSelector.requiresExclusiveTouchType = YES;
[self.view addGestureRecognizer: pinchSelector];
_viewHasAppeared = NO;
_appInForeground = NO;
Add updated iOS App support to the Vulkan examples (#1119) * Fix clang Objective-C++ flags for macOS command line builds * Fix getAssetPath() and getShaderBasePath() for macOS command line builds * Protect debugUtilsMessageCallback() from failing when pMessageIdName is NULL * Fix a few clang function override and mismatched type warnings * Fix validation layer warnings on exit for computeraytracing example * Fix regression in text visibility toggle for textOverlay example * Support VK_USE_PLATFORM_METAL_EXT vs. deprecated VK_USE_PLATFORM_MACOS_MVK / DVK_USE_PLATFORM_IOS_MVK * Check dynamic state features before enabling capabilities in dynamicstate example * Fix vkCmdDraw() vertexCount argument (PARTICLE_COUNT) in particlesystem example * Update examples list and restore benchmarking script (to top level) * Fix validation warning in descriptorindexing example * Fix device max recursion depth validation warnings in ray tracing examples * Fix OpenMP build settings for texture3d example on all platforms * Update and simplify build instructions for macOS * Update CI script with correct library path for libomp on macOS x86_64 * Update CI scipt to install libomp prior to macOS builds * Trying one more time to get the CI script working for macOS libomp * Fix vertexCount argument using calculated size in particlesystem example * Fix combined image descriptor offset calculation in descriptorbuffer example * Add iOS App support for Vulkan examples on simulator and physical devices * Add continuous integration (CI) script for iOS * Update CI script to build iOS using Xcode 14 via macos-12 runner-image * Update iOS project docs for Xcode 14 and rename ios folder to apple * Update macOS docs and CI script to use LIBOMP_PREFIX for OpenMP library path * Delete benchmark-all-validate.py Delete benchmark script as per feedback from Sascha Willems * Update debugprintf example documentation in examples.h
2024-05-22 15:07:27 -04:00
}
-(void) viewDidAppear: (BOOL) animated {
[super viewDidAppear: animated];
_viewHasAppeared = YES;
}
-(BOOL) canBecomeFirstResponder { return _viewHasAppeared; }
-(void) renderFrame {
if (_appInForeground)
{
_mvkExample->displayLinkOutputCb(); // SRS - Call displayLinkOutputCb() to render/animate at displayLink frame rate
}
}
- (void)appInForeground {
_appInForeground = YES;
}
- (void)appInBackground {
_appInForeground = NO;
Add updated iOS App support to the Vulkan examples (#1119) * Fix clang Objective-C++ flags for macOS command line builds * Fix getAssetPath() and getShaderBasePath() for macOS command line builds * Protect debugUtilsMessageCallback() from failing when pMessageIdName is NULL * Fix a few clang function override and mismatched type warnings * Fix validation layer warnings on exit for computeraytracing example * Fix regression in text visibility toggle for textOverlay example * Support VK_USE_PLATFORM_METAL_EXT vs. deprecated VK_USE_PLATFORM_MACOS_MVK / DVK_USE_PLATFORM_IOS_MVK * Check dynamic state features before enabling capabilities in dynamicstate example * Fix vkCmdDraw() vertexCount argument (PARTICLE_COUNT) in particlesystem example * Update examples list and restore benchmarking script (to top level) * Fix validation warning in descriptorindexing example * Fix device max recursion depth validation warnings in ray tracing examples * Fix OpenMP build settings for texture3d example on all platforms * Update and simplify build instructions for macOS * Update CI script with correct library path for libomp on macOS x86_64 * Update CI scipt to install libomp prior to macOS builds * Trying one more time to get the CI script working for macOS libomp * Fix vertexCount argument using calculated size in particlesystem example * Fix combined image descriptor offset calculation in descriptorbuffer example * Add iOS App support for Vulkan examples on simulator and physical devices * Add continuous integration (CI) script for iOS * Update CI script to build iOS using Xcode 14 via macos-12 runner-image * Update iOS project docs for Xcode 14 and rename ios folder to apple * Update macOS docs and CI script to use LIBOMP_PREFIX for OpenMP library path * Delete benchmark-all-validate.py Delete benchmark script as per feedback from Sascha Willems * Update debugprintf example documentation in examples.h
2024-05-22 15:07:27 -04:00
}
-(void) shutdownExample {
[_displayLink invalidate];
delete _mvkExample;
}
// Toggle the display of the virtual keyboard
-(void) toggleKeyboard {
if (self.isFirstResponder) {
[self resignFirstResponder];
} else {
[self becomeFirstResponder];
}
}
// Display and hide the keyboard by double tapping on the view
-(void) handleTapGesture: (UITapGestureRecognizer*) gestureRecognizer {
if (gestureRecognizer.state == UIGestureRecognizerStateEnded) {
[self toggleKeyboard];
}
}
#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 keychar = (text.length > 0) ? [text.lowercaseString characterAtIndex: 0] : 0;
_mvkExample->keyPressed(keychar);
}
// The delete backward key has been pressed.
-(void) deleteBackward {
_mvkExample->keyPressed(KEY_DELETE);
}
#pragma mark UITouch methods
-(CGPoint) getTouchLocalPoint:(UIEvent*) theEvent {
UITouch *touch = [[theEvent allTouches] anyObject];
CGPoint point = [touch locationInView: self.view];
point.x *= self.view.contentScaleFactor;
point.y *= self.view.contentScaleFactor;
return point;
}
// SRS - Handle touch events
-(void) touchesBegan:(NSSet*) touches withEvent:(UIEvent*) theEvent {
if (touches.count == 1) {
auto point = [self getTouchLocalPoint: theEvent];
_mvkExample->mouseDown(point.x, point.y);
}
}
-(void) touchesMoved:(NSSet*) touches withEvent:(UIEvent*) theEvent {
if (touches.count == 1) {
auto point = [self getTouchLocalPoint: theEvent];
_mvkExample->mouseDragged(point.x, point.y);
}
}
-(void) touchesEnded:(NSSet*) touches withEvent:(UIEvent*) theEvent {
_mvkExample->mouseUp();
}
-(void) touchesCancelled:(NSSet*) touches withEvent:(UIEvent*) theEvent {
_mvkExample->mouseUp();
}
#pragma mark UIGesture methods
-(CGPoint) getGestureLocalPoint:(UIGestureRecognizer*) gestureRecognizer {
CGPoint point = [gestureRecognizer locationInView: self.view];
point.x *= self.view.contentScaleFactor;
point.y *= self.view.contentScaleFactor;
return point;
}
// SRS - Respond to pan gestures for translation
-(void) handlePanGesture: (UIPanGestureRecognizer*) gestureRecognizer {
switch (gestureRecognizer.state) {
case UIGestureRecognizerStateBegan: {
_startPoint = [self getGestureLocalPoint: gestureRecognizer];
_mvkExample->otherMouseDown(_startPoint.x, _startPoint.y);
break;
}
case UIGestureRecognizerStateChanged: {
auto translation = [gestureRecognizer translationInView: self.view];
translation.x *= self.view.contentScaleFactor;
translation.y *= self.view.contentScaleFactor;
_mvkExample->mouseDragged(_startPoint.x + translation.x, _startPoint.y + translation.y);
break;
}
default: {
_mvkExample->otherMouseUp();
break;
}
}
}
// SRS - Respond to pinch gestures for zoom
-(void) handlePinchGesture: (UIPinchGestureRecognizer*) gestureRecognizer {
switch (gestureRecognizer.state) {
case UIGestureRecognizerStateBegan: {
_startPoint = [self getGestureLocalPoint: gestureRecognizer];
_mvkExample->rightMouseDown(_startPoint.x, _startPoint.y);
break;
}
case UIGestureRecognizerStateChanged: {
_mvkExample->mouseDragged(_startPoint.x, _startPoint.y - self.view.frame.size.height * log(gestureRecognizer.scale));
break;
}
default: {
_mvkExample->rightMouseUp();
break;
}
}
}
@end
#pragma mark -
#pragma mark DemoView
@implementation DemoView
/** Returns a Metal-compatible layer. */
+(Class) layerClass { return [CAMetalLayer class]; }
@end