From 9965a5ba1f8512e598c03430f3f9a9175da64d7a Mon Sep 17 00:00:00 2001 From: Georg Hagen Date: Wed, 5 Jun 2024 16:57:11 +0200 Subject: [PATCH] Add OpenVulkanoOrientationLockableViewController and make openVulkanoView accesible from swift --- ...ulkanoOrientationLockableViewController.mm | 59 +++++++++++++++++++ .../Host/iOS/OpenVulkanoViewController.h | 13 ++-- .../Host/iOS/OpenVulkanoViewController.mm | 19 +++--- 3 files changed, 77 insertions(+), 14 deletions(-) create mode 100644 openVulkanoCpp/Host/iOS/OpenVulkanoOrientationLockableViewController.mm diff --git a/openVulkanoCpp/Host/iOS/OpenVulkanoOrientationLockableViewController.mm b/openVulkanoCpp/Host/iOS/OpenVulkanoOrientationLockableViewController.mm new file mode 100644 index 0000000..744b4b8 --- /dev/null +++ b/openVulkanoCpp/Host/iOS/OpenVulkanoOrientationLockableViewController.mm @@ -0,0 +1,59 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +#import "OpenVulkanoViewController.h" + +#pragma mark - +#pragma mark OpenVulkanoViewController + +@implementation OpenVulkanoOrientationLockableViewController +-(id)init { + [super init]; + _rotationLockedView = nil; + return self; +} + +-(void) viewDidLoad { + [super viewDidLoad]; +} + +- (void)viewWillLayoutSubviews +{ + [super viewWillLayoutSubviews]; + if (_rotationLockedView != nil) + { + _rotationLockedView.center = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds)); + } +} + +-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator { + [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; + + if (_rotationLockedView != nil) + { + [coordinator animateAlongsideTransition:^(id context) { + CGAffineTransform deltaTransform = coordinator.targetTransform; + CGFloat deltaAngle = atan2f(deltaTransform.b, deltaTransform.a); + + CGFloat currentRotation = [[_rotationLockedView.layer valueForKeyPath:@"transform.rotation.z"] floatValue]; + // Adding a small value to the rotation angle forces the animation to occur in a the desired direction, preventing an issue where the view would appear to rotate 2PI radians during a rotation from LandscapeRight -> LandscapeLeft. + currentRotation += -1 * deltaAngle + 0.0001; + [_rotationLockedView.layer setValue:@(currentRotation) forKeyPath:@"transform.rotation.z"]; + + } completion:^(id context) { + // Integralize the transform to undo the extra 0.0001 added to the rotation angle. + CGAffineTransform currentTransform = _rotationLockedView.transform; + currentTransform.a = round(currentTransform.a); + currentTransform.b = round(currentTransform.b); + currentTransform.c = round(currentTransform.c); + currentTransform.d = round(currentTransform.d); + _rotationLockedView.transform = currentTransform; + }]; + } +} +@end + + diff --git a/openVulkanoCpp/Host/iOS/OpenVulkanoViewController.h b/openVulkanoCpp/Host/iOS/OpenVulkanoViewController.h index 0935db7..0a9e20b 100644 --- a/openVulkanoCpp/Host/iOS/OpenVulkanoViewController.h +++ b/openVulkanoCpp/Host/iOS/OpenVulkanoViewController.h @@ -13,10 +13,15 @@ #pragma mark OpenVulkanoViewController @interface OpenVulkanoViewController : UIViewController -{ - @public OpenVulkanoView* openVulkanoView; - @public BOOL fixOpenVulkanoViewOrientation; -} + +@property (nonatomic, strong) OpenVulkanoView* openVulkanoView; + -(void*) makeGraphicsApp; + @end +@interface OpenVulkanoOrientationLockableViewController : OpenVulkanoViewController + +@property (nonatomic, strong) UIView* rotationLockedView; + +@end diff --git a/openVulkanoCpp/Host/iOS/OpenVulkanoViewController.mm b/openVulkanoCpp/Host/iOS/OpenVulkanoViewController.mm index 20ebc71..186b493 100644 --- a/openVulkanoCpp/Host/iOS/OpenVulkanoViewController.mm +++ b/openVulkanoCpp/Host/iOS/OpenVulkanoViewController.mm @@ -30,8 +30,7 @@ using namespace OpenVulkano; -(id)init { [super init]; - openVulkanoView = nil; - fixOpenVulkanoViewOrientation = false; + _openVulkanoView = nil; return self; } @@ -44,40 +43,40 @@ using namespace OpenVulkano; -(void) viewDidLoad { [super viewDidLoad]; - if (openVulkanoView == nil && [self.view isKindOfClass:[OpenVulkanoView class]]) { - openVulkanoView = (OpenVulkanoView*)self.view; + if (_openVulkanoView == nil && [self.view isKindOfClass:[OpenVulkanoView class]]) { + _openVulkanoView = (OpenVulkanoView*)self.view; } //TODO check if type is correct IGraphicsApp* appPtr = static_cast(self.makeGraphicsApp); if (!appPtr) throw std::runtime_error("Failed to create graphics app"); app = std::unique_ptr(appPtr); - manager = new GraphicsAppManager(app.get(), (IVulkanWindow*)[openVulkanoView GetWindow]); + manager = new GraphicsAppManager(app.get(), (IVulkanWindow*)[_openVulkanoView GetWindow]); manager->StartUp(); } -(void) viewWillAppear:(BOOL)animated { - if (openVulkanoView != nil) { [openVulkanoView willAppear]; } + if (_openVulkanoView != nil) { [_openVulkanoView WillAppear]; } [super viewWillAppear:animated]; } -(void) viewDidAppear:(BOOL)animated { - if (openVulkanoView != nil) { [openVulkanoView DidAppear]; } + if (_openVulkanoView != nil) { [_openVulkanoView DidAppear]; } [super viewDidAppear:animated]; } -(void) viewWillDisappear:(BOOL)animated { - if (openVulkanoView != nil) { [openVulkanoView WillDisappear]; } + if (_openVulkanoView != nil) { [_openVulkanoView WillDisappear]; } [super viewWillDisappear:animated]; } -(void) viewDidDisappear:(BOOL)animated { - if (openVulkanoView != nil) { [openVulkanoView DidDisappear]; } + if (_openVulkanoView != nil) { [_openVulkanoView DidDisappear]; } [super viewDidDisappear:animated]; } -(void) viewDidUnload { - if (openVulkanoView != nil) { [openVulkanoView DidUnload]; } + if (_openVulkanoView != nil) { [_openVulkanoView DidUnload]; } [super viewDidUnload]; }