mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-02-17 04:39:34 +00:00
Added iCade support to the iOS build
This commit is contained in:
parent
5c22ef363c
commit
dc25d42eca
@ -443,7 +443,10 @@ elseif(IOS)
|
||||
ios/ViewController.mm
|
||||
ios/ViewController.h
|
||||
ios/AudioEngine.mm
|
||||
ios/AudioEngine.h)
|
||||
ios/AudioEngine.h
|
||||
ios/iCade/iCadeReaderView.h
|
||||
ios/iCade/iCadeReaderView.m
|
||||
ios/iCade/iCadeState.h)
|
||||
set(nativeExtraLibs ${nativeExtraLibs} "-framework Foundation -framework AudioToolbox -framework CoreGraphics -framework QuartzCore -framework OpenGLES -framework UIKit -framework GLKit -framework OpenAL")
|
||||
set(TargetBin PPSSPP)
|
||||
elseif(USING_QT_UI)
|
||||
|
@ -3,6 +3,8 @@
|
||||
#import <UIKit/UIKit.h>
|
||||
#import <GLKit/GLKit.h>
|
||||
|
||||
@interface ViewController : GLKViewController
|
||||
#import "iCade/iCadeReaderView.h"
|
||||
|
||||
@interface ViewController : GLKViewController <iCadeEventDelegate>
|
||||
|
||||
@end
|
||||
|
@ -30,6 +30,9 @@ static uint32_t pad_buttons_async_set = 0;
|
||||
static uint32_t pad_buttons_async_clear = 0;
|
||||
static uint32_t pad_buttons_down = 0;
|
||||
|
||||
double lastSelectPress = 0.0f;
|
||||
bool simulateAnalog = false;
|
||||
|
||||
extern ScreenManager *screenManager;
|
||||
InputState input_state;
|
||||
|
||||
@ -45,11 +48,12 @@ ViewController* sharedViewController;
|
||||
@property (nonatomic,retain) NSString* bundlePath;
|
||||
@property (nonatomic,retain) NSMutableArray* touches;
|
||||
@property (nonatomic,retain) AudioEngine* audioEngine;
|
||||
@property (nonatomic,retain) iCadeReaderView *iCadeView;
|
||||
|
||||
@end
|
||||
|
||||
@implementation ViewController
|
||||
@synthesize documentsPath,bundlePath,touches,audioEngine;
|
||||
@synthesize documentsPath,bundlePath,touches,audioEngine,iCadeView;
|
||||
|
||||
- (id)init
|
||||
{
|
||||
@ -133,6 +137,11 @@ ViewController* sharedViewController;
|
||||
UISwipeGestureRecognizer* gesture = [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)] autorelease];
|
||||
[self.view addGestureRecognizer:gesture];
|
||||
*/
|
||||
|
||||
self.iCadeView = [[iCadeReaderView alloc] init];
|
||||
[self.view addSubview:self.iCadeView];
|
||||
self.iCadeView.delegate = self;
|
||||
self.iCadeView.active = YES;
|
||||
}
|
||||
|
||||
- (void)viewDidUnload
|
||||
@ -154,6 +163,7 @@ ViewController* sharedViewController;
|
||||
{
|
||||
[self viewDidUnload];
|
||||
|
||||
self.iCadeView = nil;
|
||||
self.audioEngine = nil;
|
||||
self.touches = nil;
|
||||
self.documentsPath = nil;
|
||||
@ -183,8 +193,31 @@ ViewController* sharedViewController;
|
||||
lock_guard guard(input_state.lock);
|
||||
pad_buttons_down |= pad_buttons_async_set;
|
||||
pad_buttons_down &= ~pad_buttons_async_clear;
|
||||
input_state.pad_lstick_x = 0;
|
||||
input_state.pad_lstick_y = 0;
|
||||
|
||||
float analogX = 0;
|
||||
float analogY = 0;
|
||||
|
||||
if (simulateAnalog) {
|
||||
if (pad_buttons_down & PAD_BUTTON_UP) {
|
||||
analogY = 1.0f;
|
||||
pad_buttons_down &= ~PAD_BUTTON_UP;
|
||||
}
|
||||
if (pad_buttons_down & PAD_BUTTON_DOWN) {
|
||||
analogY = -1.0f;
|
||||
pad_buttons_down &= ~PAD_BUTTON_DOWN;
|
||||
}
|
||||
if (pad_buttons_down & PAD_BUTTON_LEFT) {
|
||||
analogX = -1.0f;
|
||||
pad_buttons_down &= ~PAD_BUTTON_LEFT;
|
||||
}
|
||||
if (pad_buttons_down & PAD_BUTTON_RIGHT) {
|
||||
analogX = 1.0f;
|
||||
pad_buttons_down &= ~PAD_BUTTON_RIGHT;
|
||||
}
|
||||
}
|
||||
|
||||
input_state.pad_lstick_x = analogX;
|
||||
input_state.pad_lstick_y = analogY;
|
||||
input_state.pad_rstick_x = 0;
|
||||
input_state.pad_rstick_y = 0;
|
||||
input_state.pad_buttons = pad_buttons_down;
|
||||
@ -316,4 +349,144 @@ void bindDefaultFBO()
|
||||
void EnableFZ(){};
|
||||
void DisableFZ(){};
|
||||
|
||||
- (void)buttonDown:(iCadeState)button
|
||||
{
|
||||
switch (button) {
|
||||
case iCadeJoystickUp :
|
||||
pad_buttons_async_set |= PAD_BUTTON_UP;
|
||||
pad_buttons_async_clear &= ~PAD_BUTTON_UP;
|
||||
break;
|
||||
|
||||
case iCadeJoystickRight :
|
||||
pad_buttons_async_set |= PAD_BUTTON_RIGHT;
|
||||
pad_buttons_async_clear &= ~PAD_BUTTON_RIGHT;
|
||||
break;
|
||||
|
||||
case iCadeJoystickDown :
|
||||
pad_buttons_async_set |= PAD_BUTTON_DOWN;
|
||||
pad_buttons_async_clear &= ~PAD_BUTTON_DOWN;
|
||||
break;
|
||||
|
||||
case iCadeJoystickLeft :
|
||||
pad_buttons_async_set |= PAD_BUTTON_LEFT;
|
||||
pad_buttons_async_clear &= ~PAD_BUTTON_LEFT;
|
||||
break;
|
||||
|
||||
case iCadeButtonA :
|
||||
pad_buttons_async_set |= PAD_BUTTON_SELECT;
|
||||
pad_buttons_async_clear &= ~PAD_BUTTON_SELECT;
|
||||
break;
|
||||
|
||||
case iCadeButtonB :
|
||||
pad_buttons_async_set |= PAD_BUTTON_LBUMPER;
|
||||
pad_buttons_async_clear &= ~PAD_BUTTON_LBUMPER;
|
||||
break;
|
||||
|
||||
case iCadeButtonC :
|
||||
pad_buttons_async_set |= PAD_BUTTON_START;
|
||||
pad_buttons_async_clear &= ~PAD_BUTTON_START;
|
||||
break;
|
||||
|
||||
case iCadeButtonD :
|
||||
pad_buttons_async_set |= PAD_BUTTON_RBUMPER;
|
||||
pad_buttons_async_clear &= ~PAD_BUTTON_RBUMPER;
|
||||
break;
|
||||
|
||||
case iCadeButtonE :
|
||||
pad_buttons_async_set |= PAD_BUTTON_X;
|
||||
pad_buttons_async_clear &= ~PAD_BUTTON_X;
|
||||
break;
|
||||
|
||||
case iCadeButtonF :
|
||||
pad_buttons_async_set |= PAD_BUTTON_A;
|
||||
pad_buttons_async_clear &= ~PAD_BUTTON_A;
|
||||
break;
|
||||
|
||||
case iCadeButtonG :
|
||||
pad_buttons_async_set |= PAD_BUTTON_Y;
|
||||
pad_buttons_async_clear &= ~PAD_BUTTON_Y;
|
||||
break;
|
||||
|
||||
case iCadeButtonH :
|
||||
pad_buttons_async_set |= PAD_BUTTON_B;
|
||||
pad_buttons_async_clear &= ~PAD_BUTTON_B;
|
||||
break;
|
||||
|
||||
default :
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)buttonUp:(iCadeState)button
|
||||
{
|
||||
switch (button) {
|
||||
case iCadeJoystickUp :
|
||||
pad_buttons_async_set &= ~PAD_BUTTON_UP;
|
||||
pad_buttons_async_clear |= PAD_BUTTON_UP;
|
||||
break;
|
||||
|
||||
case iCadeJoystickRight :
|
||||
pad_buttons_async_set &= ~PAD_BUTTON_RIGHT;
|
||||
pad_buttons_async_clear |= PAD_BUTTON_RIGHT;
|
||||
break;
|
||||
|
||||
case iCadeJoystickDown :
|
||||
pad_buttons_async_set &= ~PAD_BUTTON_DOWN;
|
||||
pad_buttons_async_clear |= PAD_BUTTON_DOWN;
|
||||
break;
|
||||
|
||||
case iCadeJoystickLeft :
|
||||
pad_buttons_async_set &= ~PAD_BUTTON_LEFT;
|
||||
pad_buttons_async_clear |= PAD_BUTTON_LEFT;
|
||||
break;
|
||||
|
||||
case iCadeButtonA :
|
||||
pad_buttons_async_set &= ~PAD_BUTTON_SELECT;
|
||||
pad_buttons_async_clear |= PAD_BUTTON_SELECT;
|
||||
|
||||
if ((lastSelectPress + 1.0f) > time_now_d())
|
||||
simulateAnalog = !simulateAnalog;
|
||||
lastSelectPress = time_now_d();
|
||||
break;
|
||||
|
||||
case iCadeButtonB :
|
||||
pad_buttons_async_set &= ~PAD_BUTTON_LBUMPER;
|
||||
pad_buttons_async_clear |= PAD_BUTTON_LBUMPER;
|
||||
break;
|
||||
|
||||
case iCadeButtonC :
|
||||
pad_buttons_async_set &= ~PAD_BUTTON_START;
|
||||
pad_buttons_async_clear |= PAD_BUTTON_START;
|
||||
break;
|
||||
|
||||
case iCadeButtonD :
|
||||
pad_buttons_async_set &= ~PAD_BUTTON_RBUMPER;
|
||||
pad_buttons_async_clear |= PAD_BUTTON_RBUMPER;
|
||||
break;
|
||||
|
||||
case iCadeButtonE :
|
||||
pad_buttons_async_set &= ~PAD_BUTTON_X;
|
||||
pad_buttons_async_clear |= PAD_BUTTON_X;
|
||||
break;
|
||||
|
||||
case iCadeButtonF :
|
||||
pad_buttons_async_set &= ~PAD_BUTTON_A;
|
||||
pad_buttons_async_clear |= PAD_BUTTON_A;
|
||||
break;
|
||||
|
||||
case iCadeButtonG :
|
||||
pad_buttons_async_set &= ~PAD_BUTTON_Y;
|
||||
pad_buttons_async_clear |= PAD_BUTTON_Y;
|
||||
break;
|
||||
|
||||
case iCadeButtonH :
|
||||
pad_buttons_async_set &= ~PAD_BUTTON_B;
|
||||
pad_buttons_async_clear |= PAD_BUTTON_B;
|
||||
break;
|
||||
|
||||
default :
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
66
ios/iCade/iCadeReaderView.h
Executable file
66
ios/iCade/iCadeReaderView.h
Executable file
@ -0,0 +1,66 @@
|
||||
/*
|
||||
Copyright (C) 2011 by Stuart Carnie
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "iCadeState.h"
|
||||
|
||||
/*
|
||||
UP ON,OFF = w,e
|
||||
RT ON,OFF = d,c
|
||||
DN ON,OFF = x,z
|
||||
LT ON,OFF = a,q
|
||||
A ON,OFF = y,t
|
||||
B ON,OFF = h,r
|
||||
C ON,OFF = u,f
|
||||
D ON,OFF = j,n
|
||||
E ON,OFF = i,m
|
||||
F ON,OFF = k,p
|
||||
G ON,OFF = o,g
|
||||
H ON,OFF = l,v
|
||||
*/
|
||||
|
||||
@protocol iCadeEventDelegate <NSObject>
|
||||
|
||||
@optional
|
||||
- (void)stateChanged:(iCadeState)state;
|
||||
- (void)buttonDown:(iCadeState)button;
|
||||
- (void)buttonUp:(iCadeState)button;
|
||||
|
||||
@end
|
||||
|
||||
@interface iCadeReaderView : UIView<UIKeyInput> {
|
||||
UIView *inputView;
|
||||
iCadeState _iCadeState;
|
||||
id<iCadeEventDelegate> _delegate;
|
||||
|
||||
struct {
|
||||
bool stateChanged:1;
|
||||
bool buttonDown:1;
|
||||
bool buttonUp:1;
|
||||
} _delegateFlags;
|
||||
}
|
||||
|
||||
@property (nonatomic, assign) iCadeState iCadeState;
|
||||
@property (nonatomic, assign) id<iCadeEventDelegate> delegate;
|
||||
@property (nonatomic, assign) BOOL active;
|
||||
|
||||
@end
|
141
ios/iCade/iCadeReaderView.m
Executable file
141
ios/iCade/iCadeReaderView.m
Executable file
@ -0,0 +1,141 @@
|
||||
/*
|
||||
Copyright (C) 2011 by Stuart Carnie
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#import "iCadeReaderView.h"
|
||||
|
||||
static const char *ON_STATES = "wdxayhujikol";
|
||||
static const char *OFF_STATES = "eczqtrfnmpgv";
|
||||
|
||||
@interface iCadeReaderView()
|
||||
|
||||
- (void)didEnterBackground;
|
||||
- (void)didBecomeActive;
|
||||
|
||||
@end
|
||||
|
||||
@implementation iCadeReaderView
|
||||
|
||||
@synthesize iCadeState=_iCadeState, delegate=_delegate, active;
|
||||
|
||||
- (id)initWithFrame:(CGRect)frame {
|
||||
self = [super initWithFrame:frame];
|
||||
inputView = [[UIView alloc] initWithFrame:CGRectZero];
|
||||
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didEnterBackground) name:UIApplicationDidEnterBackgroundNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil];
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidBecomeActiveNotification object:nil];
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void)didEnterBackground {
|
||||
if (self.active)
|
||||
[self resignFirstResponder];
|
||||
}
|
||||
|
||||
- (void)didBecomeActive {
|
||||
if (self.active)
|
||||
[self becomeFirstResponder];
|
||||
}
|
||||
|
||||
- (BOOL)canBecomeFirstResponder {
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)setActive:(BOOL)value {
|
||||
if (active == value) return;
|
||||
|
||||
active = value;
|
||||
if (active) {
|
||||
[self becomeFirstResponder];
|
||||
} else {
|
||||
[self resignFirstResponder];
|
||||
}
|
||||
}
|
||||
|
||||
- (UIView*) inputView {
|
||||
return inputView;
|
||||
}
|
||||
|
||||
- (void)setDelegate:(id<iCadeEventDelegate>)delegate {
|
||||
_delegate = delegate;
|
||||
if (!_delegate) return;
|
||||
|
||||
_delegateFlags.stateChanged = [_delegate respondsToSelector:@selector(stateChanged:)];
|
||||
_delegateFlags.buttonDown = [_delegate respondsToSelector:@selector(buttonDown:)];
|
||||
_delegateFlags.buttonUp = [_delegate respondsToSelector:@selector(buttonUp:)];
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
#pragma mark UIKeyInput Protocol Methods
|
||||
|
||||
- (BOOL)hasText {
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)insertText:(NSString *)text {
|
||||
|
||||
char ch = [text characterAtIndex:0];
|
||||
char *p = strchr(ON_STATES, ch);
|
||||
bool stateChanged = false;
|
||||
if (p) {
|
||||
int index = p-ON_STATES;
|
||||
_iCadeState |= (1 << index);
|
||||
stateChanged = true;
|
||||
if (_delegateFlags.buttonDown) {
|
||||
[_delegate buttonDown:(1 << index)];
|
||||
}
|
||||
} else {
|
||||
p = strchr(OFF_STATES, ch);
|
||||
if (p) {
|
||||
int index = p-OFF_STATES;
|
||||
_iCadeState &= ~(1 << index);
|
||||
stateChanged = true;
|
||||
if (_delegateFlags.buttonUp) {
|
||||
[_delegate buttonUp:(1 << index)];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (stateChanged && _delegateFlags.stateChanged) {
|
||||
[_delegate stateChanged:_iCadeState];
|
||||
}
|
||||
|
||||
static int cycleResponder = 0;
|
||||
if (++cycleResponder > 20) {
|
||||
// necessary to clear a buffer that accumulates internally
|
||||
cycleResponder = 0;
|
||||
[self resignFirstResponder];
|
||||
[self becomeFirstResponder];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)deleteBackward {
|
||||
// This space intentionally left blank to complete protocol
|
||||
}
|
||||
|
||||
@end
|
44
ios/iCade/iCadeState.h
Executable file
44
ios/iCade/iCadeState.h
Executable file
@ -0,0 +1,44 @@
|
||||
/*
|
||||
Copyright (C) 2011 by Stuart Carnie
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
typedef enum iCadeState {
|
||||
iCadeJoystickNone = 0x000,
|
||||
iCadeJoystickUp = 0x001,
|
||||
iCadeJoystickRight = 0x002,
|
||||
iCadeJoystickDown = 0x004,
|
||||
iCadeJoystickLeft = 0x008,
|
||||
|
||||
iCadeJoystickUpRight = iCadeJoystickUp | iCadeJoystickRight,
|
||||
iCadeJoystickDownRight = iCadeJoystickDown | iCadeJoystickRight,
|
||||
iCadeJoystickUpLeft = iCadeJoystickUp | iCadeJoystickLeft,
|
||||
iCadeJoystickDownLeft = iCadeJoystickDown | iCadeJoystickLeft,
|
||||
|
||||
iCadeButtonA = 0x010,
|
||||
iCadeButtonB = 0x020,
|
||||
iCadeButtonC = 0x040,
|
||||
iCadeButtonD = 0x080,
|
||||
iCadeButtonE = 0x100,
|
||||
iCadeButtonF = 0x200,
|
||||
iCadeButtonG = 0x400,
|
||||
iCadeButtonH = 0x800,
|
||||
|
||||
} iCadeState;
|
Loading…
x
Reference in New Issue
Block a user