fix SonarPen for iOS

This commit is contained in:
2019-10-14 12:50:41 +02:00
parent 258f6a6aff
commit 3c99653c09
7 changed files with 60 additions and 15 deletions

View File

@@ -16,6 +16,8 @@
openURL:(NSURL *)url openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options; options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options;
- (float)sonarpen_pressure; - (float)sonarpen_pressure;
- (bool)sonarpen_present;
- (void)hockeyapp_crash; - (void)hockeyapp_crash;
- (void)sonarpen_start;
@end @end

View File

@@ -18,6 +18,7 @@
@interface AppDelegate () { @interface AppDelegate () {
GameViewController* view; GameViewController* view;
WTSonarPenDriver* sonarpen_driver; WTSonarPenDriver* sonarpen_driver;
bool sonarpen_started;
} }
@end @end
@@ -35,6 +36,11 @@
[MSCrashes generateTestCrash]; [MSCrashes generateTestCrash];
} }
- (bool)sonarpen_present
{
return sonarpen_started && [sonarpen_driver isPenAttached];
}
- (float)sonarpen_pressure - (float)sonarpen_pressure
{ {
return [sonarpen_driver isPenAttached] ? [sonarpen_driver pressure] : 1.f; return [sonarpen_driver isPenAttached] ? [sonarpen_driver pressure] : 1.f;
@@ -46,29 +52,41 @@
case WTSonarPenDriverStateInit: case WTSonarPenDriverStateInit:
NSLog(@"Status: Initializing"); break; NSLog(@"Status: Initializing"); break;
case WTSonarPenDriverStateRunning: case WTSonarPenDriverStateRunning:
NSLog(@"Status: Running"); break; NSLog(@"Status: Running");
App::I->message_box("SonarPen", "Your SonarPen is now ready. Have fun!");
break;
case WTSonarPenDriverStateCalibrating: case WTSonarPenDriverStateCalibrating:
NSLog(@"Status: Calibrating"); break; NSLog(@"Status: Calibrating"); break;
case WTSonarPenDriverStateNotSonarPen: case WTSonarPenDriverStateNotSonarPen:
NSLog(@"Status: Not a Sonar Pen"); break; NSLog(@"Status: Not a Sonar Pen");
App::I->message_box("SonarPen Error", "Couldn't recognize the device attatched to the jack plug as a SonarPen. Please remove it and plug it back in.");
break;
case WTSonarPenDriverStateCalibratingMax: case WTSonarPenDriverStateCalibratingMax:
NSLog(@"Status: Calibrating Max Value"); break; NSLog(@"Status: Calibrating Max Value"); break;
case WTSonarPenDriverStateWaitingForPermission: case WTSonarPenDriverStateWaitingForPermission:
NSLog(@"Status: Wait for Permission"); break; NSLog(@"Status: Wait for Permission"); break;
case WTSonarPenDriverStateNoMicrophonePermission: case WTSonarPenDriverStateNoMicrophonePermission:
NSLog(@"Status: No Microphone Permission"); break; NSLog(@"Status: No Microphone Permission");
App::I->message_box("SonarPen Error", "SonarPen could not be started because you didn't allow the microphone permission. Please go to Settings -> PanoPainter and enable Microphone.");
break;
} }
} }
- (void)sonarpen_start {
if (sonarpen_started)
return;
sonarpen_driver = [[WTSonarPenDriver alloc] initWithApplication:[UIApplication sharedApplication]];
[sonarpen_driver start];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(penStatusChanged) name:WTSonarPenDriverStateChangedNotification object:nil];
sonarpen_started = true;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//[[BITHockeyManager sharedHockeyManager] configureWithIdentifier:@"c2dccca196294ecca8fd5d58af2738cf"]; sonarpen_started = false;
[MSAppCenter start:@"c2dccca1-9629-4ecc-a8fd-5d58af2738cf" withServices:@[ [MSAppCenter start:@"c2dccca1-9629-4ecc-a8fd-5d58af2738cf" withServices:@[
[MSAnalytics class], [MSAnalytics class],
[MSCrashes class] [MSCrashes class]
]]; ]];
// sonarpen_driver = [[WTSonarPenDriver alloc] initWithApplication:application];
// [sonarpen_driver start];
// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(penStatusChanged) name:WTSonarPenDriverStateChangedNotification object:nil];
view = (GameViewController*)self.window.rootViewController; view = (GameViewController*)self.window.rootViewController;
return YES; return YES;

View File

@@ -341,12 +341,20 @@ std::set<UITouch*> ignored_touch;
CGPoint touchLocation = [touch locationInView:self.view]; CGPoint touchLocation = [touch locationInView:self.view];
float scale = self.view.contentScaleFactor; float scale = self.view.contentScaleFactor;
float force = touch.force;
AppDelegate* app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
if ([app sonarpen_present])
force = [app sonarpen_pressure];
kEventSource source = ((touch.type == UITouchType::UITouchTypeStylus) || [app sonarpen_present]) ?
kEventSource::Stylus : kEventSource::Touch;
kEventSource source = touch.type == UITouchType::UITouchTypeStylus ? kEventSource::Stylus : kEventSource::Touch; // apple pencil
if (source == kEventSource::Stylus) if (touch.type == UITouchType::UITouchTypeStylus)
pen_down = true; pen_down = true;
App::I->ui_task_async([touchLocation, scale, f=touch.force, source] { App::I->ui_task_async([touchLocation, scale, f=force, source] {
App::I->mouse_down(0, touchLocation.x * scale, touchLocation.y * scale, f, source, 0); App::I->mouse_down(0, touchLocation.x * scale, touchLocation.y * scale, f, source, 0);
}); });
t_count = 1; t_count = 1;
@@ -394,7 +402,7 @@ std::set<UITouch*> ignored_touch;
App::I->ui_task_async([tt0=t0.type,tt1=t1.type,p0,p1,f0=t0.force,f1=t1.force] { App::I->ui_task_async([tt0=t0.type,tt1=t1.type,p0,p1,f0=t0.force,f1=t1.force] {
if (tt0 == UITouchType::UITouchTypeStylus) if (tt0 == UITouchType::UITouchTypeStylus)
App::I->mouse_move(p0.x, p0.y, f0, kEventSource::Stylus, 0); App::I->mouse_move(p0.x, p0.y, f0, kEventSource::Stylus, 0);
if (tt1 == UITouchType::UITouchTypeStylus) else if (tt1 == UITouchType::UITouchTypeStylus)
App::I->mouse_move(p1.x, p1.y, f1, kEventSource::Stylus, 0); App::I->mouse_move(p1.x, p1.y, f1, kEventSource::Stylus, 0);
}); });
} }
@@ -416,8 +424,9 @@ std::set<UITouch*> ignored_touch;
UITouch *touch = valid_touches[0]; UITouch *touch = valid_touches[0];
CGPoint touchLocation = [touch locationInView:self.view]; CGPoint touchLocation = [touch locationInView:self.view];
float force = touch.type == UITouchType::UITouchTypeStylus ? touch.force : 1.0f; float force = touch.type == UITouchType::UITouchTypeStylus ? touch.force : 1.0f;
//AppDelegate* app = (AppDelegate*)[[UIApplication sharedApplication] delegate]; AppDelegate* app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
//force = [app sonarpen_pressure]; if ([app sonarpen_present])
force = [app sonarpen_pressure];
if (t_count == 2) if (t_count == 2)
{ {
//App::I->gesture_end(); //App::I->gesture_end();
@@ -425,7 +434,8 @@ std::set<UITouch*> ignored_touch;
} }
else else
{ {
kEventSource source = touch.type == UITouchType::UITouchTypeStylus ? kEventSource::Stylus : kEventSource::Touch; kEventSource source = ((touch.type == UITouchType::UITouchTypeStylus) || [app sonarpen_present]) ?
kEventSource::Stylus : kEventSource::Touch;
App::I->ui_task_async([touchLocation, scale, source, force] { App::I->ui_task_async([touchLocation, scale, source, force] {
App::I->mouse_move(touchLocation.x * scale, touchLocation.y * scale, force, source, 0); App::I->mouse_move(touchLocation.x * scale, touchLocation.y * scale, force, source, 0);
}); });
@@ -480,6 +490,7 @@ std::set<UITouch*> ignored_touch;
input_enabled = NO; input_enabled = NO;
App::I = new App; App::I = new App;
App::I->ios_view = self; App::I->ios_view = self;
App::I->ios_app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
App::I->initLog(); App::I->initLog();
//self.preferredFramesPerSecond = 60; //self.preferredFramesPerSecond = 60;

View File

@@ -245,6 +245,10 @@
<icon icon="arrow_rotate_clockwise" width="20"/> <icon icon="arrow_rotate_clockwise" width="20"/>
<text id="menu-label" text="Reset Camera" margin="0 0 0 5"/> <text id="menu-label" text="Reset Camera" margin="0 0 0 5"/>
</button-custom> </button-custom>
<button-custom os="ios" id="sonarpen" height="40" align="center" color=".2" pad="0 0 0 10" dir="row">
<icon icon="pencil" width="20"/>
<text id="menu-label" text="Start SonarPen" margin="0 0 0 5"/>
</button-custom>
</popup-menu> </popup-menu>
</layout> </layout>

View File

@@ -22,6 +22,7 @@
#if defined(__OBJC__) && defined(__IOS__) #if defined(__OBJC__) && defined(__IOS__)
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import "GameViewController.h" #import "GameViewController.h"
#import "AppDelegate.h"
#endif #endif
#if defined(__OBJC__) && defined(__OSX__) #if defined(__OBJC__) && defined(__OSX__)
@@ -152,6 +153,7 @@ public:
#if defined(__IOS__) && defined(__OBJC__) #if defined(__IOS__) && defined(__OBJC__)
GameViewController* ios_view; GameViewController* ios_view;
AppDelegate* ios_app;
#elif defined(__OSX__) && defined(__OBJC__) #elif defined(__OSX__) && defined(__OBJC__)
View* osx_view; View* osx_view;
AppOSX* osx_app; AppOSX* osx_app;

View File

@@ -1012,6 +1012,13 @@ void App::init_menu_tools()
popup_exp->destroy(); popup_exp->destroy();
}; };
#if __IOS__
popup_exp->find<NodeButtonCustom>("sonarpen")->on_click = [this, popup_exp](Node*) {
[ios_app sonarpen_start];
popup_exp->mouse_release();
popup_exp->destroy();
};
#endif
}; };
} }
} }

View File

@@ -145,7 +145,8 @@ bool Asset::create_dir(const std::string& path)
return android_create_dir(path); return android_create_dir(path);
#elif __IOS__ || __OSX__ #elif __IOS__ || __OSX__
return apple_create_dir(path); return apple_create_dir(path);
else #else
// TODO: implement for linux and web
return false; return false;
#endif #endif
} }