Play-/Source/ui_ios/EmulatorViewController.mm

316 lines
9.5 KiB
Text
Raw Normal View History

2015-07-22 02:48:26 -04:00
#include "PathUtils.h"
#import "EmulatorViewController.h"
#import "GlEsView.h"
#include "../PS2VM.h"
#include "../PS2VM_Preferences.h"
#include "../AppConfig.h"
#include "PreferenceDefs.h"
2015-07-22 02:48:26 -04:00
#include "GSH_OpenGLiOS.h"
#include "IosUtils.h"
#include "PH_Generic.h"
2015-07-22 02:48:26 -04:00
CPS2VM* g_virtualMachine = nullptr;
@interface EmulatorViewController ()
@end
@implementation EmulatorViewController
+(void)registerPreferences
{
CAppConfig::GetInstance().RegisterPreferenceBoolean(PREFERENCE_UI_SHOWFPS, false);
CAppConfig::GetInstance().RegisterPreferenceBoolean(PREFERENCE_UI_SHOWVIRTUALPAD, true);
}
2015-07-22 02:48:26 -04:00
-(void)viewDidLoad
{
CGRect screenBounds = [[UIScreen mainScreen] bounds];
auto view = [[GlEsView alloc] initWithFrame: screenBounds];
self.view = view;
self.connectObserver = [[NSNotificationCenter defaultCenter] addObserverForName:GCControllerDidConnectNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
if ([[GCController controllers] count] == 1) {
[self toggleHardwareController:YES];
}
}];
self.disconnectObserver = [[NSNotificationCenter defaultCenter] addObserverForName:GCControllerDidDisconnectNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
if (![[GCController controllers] count]) {
[self toggleHardwareController:NO];
}
}];
if ([[GCController controllers] count]) {
[self toggleHardwareController:YES];
}
self.iCadeReader = [[iCadeReaderView alloc] init];
[self.view addSubview:self.iCadeReader];
self.iCadeReader.delegate = self;
self.iCadeReader.active = YES;
}
-(void)viewDidAppear: (BOOL)animated
{
assert(g_virtualMachine == nullptr);
2015-07-22 02:48:26 -04:00
g_virtualMachine = new CPS2VM();
g_virtualMachine->Initialize();
g_virtualMachine->CreateGSHandler(CGSH_OpenGLiOS::GetFactoryFunction((CAEAGLLayer*)self.view.layer));
2015-07-22 02:48:26 -04:00
g_virtualMachine->CreatePadHandler(CPH_Generic::GetFactoryFunction());
2015-10-26 22:26:34 -04:00
const CGRect screenBounds = [[UIScreen mainScreen] bounds];
2015-10-26 22:26:34 -04:00
if(CAppConfig::GetInstance().GetPreferenceBoolean(PREFERENCE_UI_SHOWVIRTUALPAD))
{
auto padHandler = static_cast<CPH_Generic*>(g_virtualMachine->GetPadHandler());
self.virtualPadView = [[VirtualPadView alloc] initWithFrame: screenBounds padHandler: padHandler];
[self.view addSubview: self.virtualPadView];
}
if(CAppConfig::GetInstance().GetPreferenceBoolean(PREFERENCE_UI_SHOWFPS))
{
[self setupFpsCounter];
}
UIButton* but = [UIButton buttonWithType: UIButtonTypeRoundedRect];
2016-01-08 18:39:27 -05:00
[but setTitle: @"Exit" forState: UIControlStateNormal];
[but setBackgroundColor: [UIColor whiteColor]];
2016-01-08 18:39:27 -05:00
[but addTarget: self action: @selector(onExitButtonClick) forControlEvents: UIControlEventTouchUpInside];
but.frame = CGRectMake(screenBounds.size.width - 50, (screenBounds.size.height - 25) / 2, 50, 25);
[self.view addSubview: but];
2015-11-24 10:31:44 -05:00
2015-07-22 02:48:26 -04:00
g_virtualMachine->Pause();
g_virtualMachine->Reset();
if(IosUtils::IsLoadableExecutableFileName(self.imagePath))
{
g_virtualMachine->m_ee->m_os->BootFromFile([self.imagePath UTF8String]);
}
else
{
CAppConfig::GetInstance().SetPreferenceString(PS2VM_CDROM0PATH, [self.imagePath UTF8String]);
g_virtualMachine->Reset();
2015-12-06 14:53:35 -05:00
g_virtualMachine->m_ee->m_os->BootFromCDROM();
}
2015-07-22 02:48:26 -04:00
g_virtualMachine->Resume();
}
-(void)viewDidDisappear: (BOOL)animated
{
g_virtualMachine->Pause();
g_virtualMachine->Destroy();
delete g_virtualMachine;
g_virtualMachine = nullptr;
}
2016-01-30 21:06:39 -05:00
-(void)toggleHardwareController: (BOOL)useHardware
{
if(useHardware)
{
self.gController = [GCController controllers][0];
if(self.gController.gamepad)
{
[self.gController.gamepad.buttonA setValueChangedHandler:
^(GCControllerButtonInput* button, float value, BOOL pressed)
{
auto padHandler = g_virtualMachine->GetPadHandler();
if(padHandler)
{
2016-01-30 21:31:10 -05:00
static_cast<CPH_Generic*>(padHandler)->SetButtonState(PS2::CControllerInfo::CROSS, pressed);
2016-01-30 21:06:39 -05:00
}
}
];
[self.gController.gamepad.buttonB setValueChangedHandler:
^(GCControllerButtonInput* button, float value, BOOL pressed)
{
auto padHandler = g_virtualMachine->GetPadHandler();
if(padHandler)
{
static_cast<CPH_Generic*>(padHandler)->SetButtonState(PS2::CControllerInfo::CIRCLE, pressed);
}
}
];
[self.gController.gamepad.buttonX setValueChangedHandler:
^(GCControllerButtonInput* button, float value, BOOL pressed)
{
auto padHandler = g_virtualMachine->GetPadHandler();
if(padHandler)
{
2016-01-30 21:31:10 -05:00
static_cast<CPH_Generic*>(padHandler)->SetButtonState(PS2::CControllerInfo::SQUARE, pressed);
2016-01-30 21:06:39 -05:00
}
}
];
[self.gController.gamepad.buttonY setValueChangedHandler:
^(GCControllerButtonInput* button, float value, BOOL pressed)
{
auto padHandler = g_virtualMachine->GetPadHandler();
if(padHandler)
{
static_cast<CPH_Generic*>(padHandler)->SetButtonState(PS2::CControllerInfo::TRIANGLE, pressed);
}
}
];
[self.gController.gamepad.dpad setValueChangedHandler:
^(GCControllerDirectionPad* dpad, float xValue, float yValue)
{
auto padHandler = g_virtualMachine->GetPadHandler();
if(padHandler)
{
static_cast<CPH_Generic*>(padHandler)->SetAxisState(PS2::CControllerInfo::ANALOG_LEFT_X, xValue);
2016-01-30 21:31:10 -05:00
static_cast<CPH_Generic*>(padHandler)->SetAxisState(PS2::CControllerInfo::ANALOG_LEFT_Y, -yValue);
2016-01-30 21:06:39 -05:00
}
}
];
//Add controller pause handler here
}
if(self.gController.extendedGamepad)
{
[self.gController.extendedGamepad.buttonA setValueChangedHandler:
^(GCControllerButtonInput* button, float value, BOOL pressed)
{
auto padHandler = g_virtualMachine->GetPadHandler();
if(padHandler)
{
2016-01-30 21:31:10 -05:00
static_cast<CPH_Generic*>(padHandler)->SetButtonState(PS2::CControllerInfo::CROSS, pressed);
2016-01-30 21:06:39 -05:00
}
}
];
[self.gController.extendedGamepad.buttonB setValueChangedHandler:
^(GCControllerButtonInput* button, float value, BOOL pressed)
{
auto padHandler = g_virtualMachine->GetPadHandler();
if(padHandler)
{
static_cast<CPH_Generic*>(padHandler)->SetButtonState(PS2::CControllerInfo::CIRCLE, pressed);
}
}
];
[self.gController.extendedGamepad.buttonX setValueChangedHandler:
^(GCControllerButtonInput* button, float value, BOOL pressed)
{
auto padHandler = g_virtualMachine->GetPadHandler();
if(padHandler)
{
2016-01-30 21:31:10 -05:00
static_cast<CPH_Generic*>(padHandler)->SetButtonState(PS2::CControllerInfo::SQUARE, pressed);
2016-01-30 21:06:39 -05:00
}
}
];
[self.gController.extendedGamepad.buttonY setValueChangedHandler:
^(GCControllerButtonInput* button, float value, BOOL pressed)
{
auto padHandler = g_virtualMachine->GetPadHandler();
if(padHandler)
{
static_cast<CPH_Generic*>(padHandler)->SetButtonState(PS2::CControllerInfo::TRIANGLE, pressed);
}
}
];
[self.gController.extendedGamepad.dpad setValueChangedHandler:
^(GCControllerDirectionPad* dpad, float xValue, float yValue)
{
auto padHandler = g_virtualMachine->GetPadHandler();
if(padHandler)
{
static_cast<CPH_Generic*>(padHandler)->SetAxisState(PS2::CControllerInfo::ANALOG_LEFT_X, xValue);
2016-01-30 21:31:10 -05:00
static_cast<CPH_Generic*>(padHandler)->SetAxisState(PS2::CControllerInfo::ANALOG_LEFT_Y, -yValue);
2016-01-30 21:06:39 -05:00
}
}
];
[self.gController.extendedGamepad.leftThumbstick.xAxis setValueChangedHandler:
^(GCControllerAxisInput* axis, float value)
{
auto padHandler = g_virtualMachine->GetPadHandler();
if(padHandler)
{
static_cast<CPH_Generic*>(padHandler)->SetAxisState(PS2::CControllerInfo::ANALOG_LEFT_X, value);
}
}
];
[self.gController.extendedGamepad.leftThumbstick.yAxis setValueChangedHandler:
^(GCControllerAxisInput* axis, float value)
{
auto padHandler = g_virtualMachine->GetPadHandler();
if(padHandler)
{
2016-01-30 21:31:10 -05:00
static_cast<CPH_Generic*>(padHandler)->SetAxisState(PS2::CControllerInfo::ANALOG_LEFT_Y, -value);
2016-01-30 21:06:39 -05:00
}
}
];
}
}
else
{
self.gController = nil;
}
}
2015-11-24 10:31:44 -05:00
-(void)setupFpsCounter
{
auto screenBounds = [[UIScreen mainScreen] bounds];
self.fpsCounterLabel = [[UILabel alloc] initWithFrame: screenBounds];
self.fpsCounterLabel.textColor = [UIColor whiteColor];
[self.view addSubview: self.fpsCounterLabel];
g_virtualMachine->GetGSHandler()->OnNewFrame.connect(
[self] (uint32 drawCallCount)
{
@synchronized(self)
{
self.frames++;
self.drawCallCount += drawCallCount;
}
}
);
[NSTimer scheduledTimerWithTimeInterval: 1 target: self selector: @selector(updateFpsCounter) userInfo: nil repeats: YES];
}
-(void)updateFpsCounter
{
@synchronized(self)
{
uint32 dcpf = (self.frames != 0) ? (self.drawCallCount / self.frames) : 0;
self.fpsCounterLabel.text = [NSString stringWithFormat: @"%d f/s, %d dc/f",
self.frames, dcpf];
self.frames = 0;
self.drawCallCount = 0;
}
[self.fpsCounterLabel sizeToFit];
}
-(void)onSaveStateButtonClick
{
auto dataPath = Framework::PathUtils::GetPersonalDataPath();
auto statePath = dataPath / "state.sta";
g_virtualMachine->SaveState(statePath.c_str());
NSLog(@"Saved state to '%s'.", statePath.string().c_str());
}
2016-01-08 18:39:27 -05:00
-(void)onExitButtonClick
{
g_virtualMachine->Pause();
[self dismissViewControllerAnimated: YES completion: nil];
}
2015-07-22 02:48:26 -04:00
-(BOOL)prefersStatusBarHidden
{
return YES;
}
-(UIInterfaceOrientationMask)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskLandscape;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self.connectObserver];
[[NSNotificationCenter defaultCenter] removeObserver:self.disconnectObserver];
}
2015-07-22 02:48:26 -04:00
@end