Quellcode durchsuchen

Merge pull request #21 from bslack/next

Next
Sean Paul Taylor vor 14 Jahren
Ursprung
Commit
0845071961

+ 42 - 79
.gitignore

@@ -1,79 +1,42 @@
-*.suo
-*.sdf
-*.opensdf
-/.metadata
-/169.254.0.1
-/ipch
-/Debug
-/Release
-/Simulator
-/Simulator-Coverage
-/Simulator-Profile
-/Device-Debug
-/Device-Coverage
-/Device-Profile
-/Device-Release
-/gameplay.xcworkspace/xcuserdata
-/gameplay/Debug
-/gameplay/DebugMem
-/gameplay/Release
-/gameplay/Simulator
-/gameplay/Simulator-Coverage
-/gameplay/Simulator-Profile
-/gameplay/Device-Debug
-/gameplay/Device-Coverage
-/gameplay/Device-Profile
-/gameplay/Device-Release
-/gameplay/gameplay.xcodeproj/xcuserdata
-/gameplay-encoder/Debug
-/gameplay-encoder/Release
-/gameplay-encoder/gameplay-encoder.xcodeproj/xcuserdata
-/gameplay-internal
-/gameplay-samples/sample00-mesh/Debug
-/gameplay-samples/sample00-mesh/DebugMem
-/gameplay-samples/sample00-mesh/Release
-/gameplay-samples/sample00-mesh/Simulator
-/gameplay-samples/sample00-mesh/Simulator-Coverage
-/gameplay-samples/sample00-mesh/Simulator-Profile
-/gameplay-samples/sample00-mesh/Device-Debug
-/gameplay-samples/sample00-mesh/Device-Coverage
-/gameplay-samples/sample00-mesh/Device-Profile
-/gameplay-samples/sample00-mesh/Device-Release
-/gameplay-samples/sample00-mesh/res/shaders
-/gameplay-samples/sample00-mesh/sample00-mesh.xcodeproj/xcuserdata
-/gameplay-samples/sample01-longboard/Debug
-/gameplay-samples/sample01-longboard/DebugMem
-/gameplay-samples/sample01-longboard/Release
-/gameplay-samples/sample01-longboard/Simulator
-/gameplay-samples/sample01-longboard/Simulator-Coverage
-/gameplay-samples/sample01-longboard/Simulator-Profile
-/gameplay-samples/sample01-longboard/Device-Debug
-/gameplay-samples/sample01-longboard/Device-Coverage
-/gameplay-samples/sample01-longboard/Device-Profile
-/gameplay-samples/sample01-longboard/Device-Release
-/gameplay-samples/sample01-longboard/res/shaders
-/gameplay-samples/sample01-longboard/sample01-longboard.xcodeproj/xcuserdata
-/gameplay-samples/sample02-spaceship/Debug
-/gameplay-samples/sample02-spaceship/DebugMem
-/gameplay-samples/sample02-spaceship/Release
-/gameplay-samples/sample02-spaceship/Simulator
-/gameplay-samples/sample02-spaceship/Simulator-Coverage
-/gameplay-samples/sample02-spaceship/Simulator-Profile
-/gameplay-samples/sample02-spaceship/Device-Debug
-/gameplay-samples/sample02-spaceship/Device-Coverage
-/gameplay-samples/sample02-spaceship/Device-Profile
-/gameplay-samples/sample02-spaceship/Device-Release
-/gameplay-samples/sample02-spaceship/res/shaders
-/gameplay-samples/sample02-spaceship/sample02-spaceship.xcodeproj/xcuserdata
-/gameplay-samples/sample03-character/Debug
-/gameplay-samples/sample03-character/DebugMem
-/gameplay-samples/sample03-character/Release
-/gameplay-samples/sample03-character/Simulator
-/gameplay-samples/sample03-character/Simulator-Coverage
-/gameplay-samples/sample03-character/Simulator-Profile
-/gameplay-samples/sample03-character/Device-Debug
-/gameplay-samples/sample03-character/Device-Coverage
-/gameplay-samples/sample03-character/Device-Profile
-/gameplay-samples/sample03-character/Device-Release
-/gameplay-samples/sample03-character/res/shaders
-/gameplay-samples/sample03-character/sample03-character.xcodeproj/xcuserdata
+# Compiled source #
+###################
+*.com
+*.class
+*.dll
+*.exe
+*.o
+*.so
+
+# Packages #
+############
+# it's better to unpack these files and commit the raw source
+# git has its own built in compression methods
+*.7z
+*.dmg
+*.gz
+*.iso
+*.jar
+*.rar
+*.tar
+*.zip
+*.fsh
+*.vsh
+
+# Logs and databases #
+######################
+*.log
+*.sql
+*.sqlite
+
+# OS generated files #
+######################
+.DS_Store*
+ehthumbs.db
+Icon?
+Thumbs.db
+
+# PLAYBOOK Build Folders #
+##########################
+Simulator/
+Device-Debug/
+xcuserdata/

+ 6 - 0
gameplay/gameplay.xcodeproj/project.pbxproj

@@ -484,6 +484,9 @@
 		5B04C5F714BFE50B00EB0071 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
 		5B04C5F914BFE51000EB0071 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/OpenGLES.framework; sourceTree = DEVELOPER_DIR; };
 		5B04C5FB14BFE51600EB0071 /* OpenAL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenAL.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/OpenAL.framework; sourceTree = DEVELOPER_DIR; };
+		5B3383A214C5181E000DC4F8 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
+		5B3383A414C5181E000DC4F8 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
+		5B3383A614C5181E000DC4F8 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; };
 		5B43D17914C3497B008A5D9D /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; };
 		5B5ADCE214C22DF900AC6109 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = SDKs/MacOSX10.7.sdk/usr/lib/libz.dylib; sourceTree = DEVELOPER_DIR; };
 		5B5ADCE414C22E1F00AC6109 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/lib/libz.dylib; sourceTree = DEVELOPER_DIR; };
@@ -586,6 +589,9 @@
 			children = (
 				5B04C5FE14BFE52F00EB0071 /* Mac OS X */,
 				5B04C5FD14BFE52300EB0071 /* iOS */,
+				5B3383A214C5181E000DC4F8 /* UIKit.framework */,
+				5B3383A414C5181E000DC4F8 /* Foundation.framework */,
+				5B3383A614C5181E000DC4F8 /* CoreGraphics.framework */,
 			);
 			name = Frameworks;
 			sourceTree = "<group>";

+ 5 - 1
gameplay/src/Keyboard.h

@@ -182,7 +182,11 @@ public:
         KEY_LEFT_BRACE,
         KEY_BAR,
         KEY_RIGHT_BRACE,
-        KEY_TILDE
+        KEY_TILDE,
+        KEY_EURO, 
+        KEY_POUND,
+        KEY_YEN,
+        KEY_MIDDLE_DOT
     };
 
 private:

+ 22 - 2
gameplay/src/Package.cpp

@@ -94,6 +94,26 @@ bool Package::readArray(unsigned int* length, std::vector<T>* values)
     return true;
 }
 
+template <class T>
+bool Package::readArray(unsigned int* length, std::vector<T>* values, unsigned int readSize)
+{
+    assert(sizeof(T) >= readSize);
+
+    if (!read(length))
+    {
+        return false;
+    }
+    if (*length > 0 && values)
+    {
+        values->resize(*length);
+        if (fread(&(*values)[0], readSize, *length, _file) != *length)
+        {
+            return false;
+        }
+    }
+    return true;
+}
+
 std::string readString(FILE* fp)
 {
     unsigned int length;
@@ -935,7 +955,7 @@ Animation* Package::readAnimationChannel(Scene* scene, Animation* animation, con
     unsigned int interpolationCount;
 
     // read key times
-    if (!readArray(&keyTimesCount, &keyTimes))
+    if (!readArray(&keyTimesCount, &keyTimes, sizeof(unsigned int)))
     {
         LOG_ERROR_VARG("Failed to read %s for %s: %s", "keyTimes", "animation", id);
         return NULL;
@@ -963,7 +983,7 @@ Animation* Package::readAnimationChannel(Scene* scene, Animation* animation, con
     }
     
     // read interpolations
-    if (!readArray(&interpolationCount, &interpolation))
+    if (!readArray(&interpolationCount, &interpolation, sizeof(unsigned int)))
     {
         LOG_ERROR_VARG("Failed to read %s for %s: %s", "interpolation", "animation", id);
         return NULL;

+ 12 - 0
gameplay/src/Package.h

@@ -263,6 +263,18 @@ private:
     template <class T>
     bool readArray(unsigned int* length, std::vector<T>* values);
 
+    /**
+     * Reads an array of values and the array length from the current file position.
+     * 
+     * @param length A pointer to where the length of the array will be copied to.
+     * @param values A pointer to the vector to copy the values to. The vector will be resized if it is smaller than length.
+     * @param readSize The size that reads will be preformed at, size must be the same as or smaller then the sizeof(T)
+     * 
+     * @return True if successful, false if an error occurred.
+     */
+    template <class T>
+    bool readArray(unsigned int* length, std::vector<T>* values, unsigned int readSize);
+    
     /**
      * Reads 16 floats from the current file position.
      *

+ 297 - 36
gameplay/src/PlatformiOS.mm

@@ -20,36 +20,23 @@ using namespace gameplay;
 static const float ACCELEROMETER_X_FACTOR = 90.0f / WINDOW_WIDTH;
 static const float ACCELEROMETER_Y_FACTOR = 90.0f / WINDOW_HEIGHT;
 
+@class AppDelegate;
 @class View;
 
+static AppDelegate *__appDelegate = NULL;
 static View* __view = NULL;
+
 static long __timeStart;
 static long __timeAbsolute;
 static bool __vsync = WINDOW_VSYNC;
 static float __pitch;
 static float __roll;
-static int __lx;
-static int __ly;
-static bool __hasMouse = false;
-static bool __leftMouseDown = false;
-static bool __rightMouseDown = false;
-static bool __shiftDown = false;
-
 
-long getMachTimeInMilliseconds()
-{
-    static const int64_t kOneMillion = 1000 * 1000;
-    static mach_timebase_info_data_t s_timebase_info;
-    
-    if (s_timebase_info.denom == 0) 
-        (void) mach_timebase_info(&s_timebase_info);
-    
-    // mach_absolute_time() returns billionth of seconds, so divide by one million to get milliseconds
-    return (long)((mach_absolute_time() * s_timebase_info.numer) / (kOneMillion * s_timebase_info.denom));
-}
 
+long getMachTimeInMilliseconds(); 
+int getKey(unichar keyCode);
 
-@interface View : UIView 
+@interface View : UIView <UIKeyInput>
 {
     EAGLContext* context;	
     CADisplayLink* displayLink;
@@ -69,9 +56,16 @@ long getMachTimeInMilliseconds()
 - (void)startUpdating;
 - (void)stopUpdating;
 - (void)update:(id)sender;
+- (void)setSwapInterval:(NSInteger)interval;
+- (int)swapInterval;
+
+- (BOOL)showKeyboard;
+- (BOOL)dismissKeyboard;
+@end
+
+@interface View (Private)
 - (void)createFramebuffer;
 - (void)deleteFramebuffer;
-
 @end
 
 
@@ -137,11 +131,10 @@ long getMachTimeInMilliseconds()
         
         _game = Game::getInstance();
         __timeStart = getMachTimeInMilliseconds();
-        _game->run(WINDOW_WIDTH, WINDOW_HEIGHT);    // TODO: Handle based on current orientation
+        _game->run(WINDOW_WIDTH, WINDOW_HEIGHT);    // TODO: Handle based on current orientation            
     }
     return self;
 }
-
 - (void) dealloc
 {
     _game->exit();
@@ -153,6 +146,18 @@ long getMachTimeInMilliseconds()
     [super dealloc];
 }
 
+- (BOOL)canBecomeFirstResponder 
+{
+    // Override so we can control the keyboard
+    return YES;
+}
+
+- (void) layoutSubviews
+{
+    // Called on 'resize'
+    [self deleteFramebuffer];
+}
+
 - (void)createFramebuffer
 {
     // iOS Requires all content go to a rendering buffer then it is swapped into the windows rendering surface
@@ -263,19 +268,47 @@ long getMachTimeInMilliseconds()
     }
 }
 
-- (void) layoutSubviews
+- (BOOL)showKeyboard {
+    return [self becomeFirstResponder];
+}
+- (BOOL)dismissKeyboard {
+    return [self resignFirstResponder];
+}
+
+/*
+ * Virtual Keyboard Support
+ */
+- (void)insertText:(NSString *)text 
 {
-    [self deleteFramebuffer];
+    if([text length] == 0) return;
+    assert([text length] == 1);
+    unichar c = [text characterAtIndex:0];
+    int gpk = getKey(c);
+    Game::getInstance()->keyEvent(Keyboard::KEY_PRESS, gpk);    
+    Game::getInstance()->keyEvent(Keyboard::KEY_RELEASE, gpk);    
+}
+- (void)deleteBackward 
+{
+    Game::getInstance()->keyEvent(Keyboard::KEY_PRESS, Keyboard::KEY_BACKSPACE);    
+    Game::getInstance()->keyEvent(Keyboard::KEY_RELEASE, Keyboard::KEY_BACKSPACE);    
+}
+- (BOOL)hasText 
+{
+    return YES;
 }
 
+/*
+ * Touch Support
+ */
 - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
 {
     unsigned int uniqueTouch = 0;
     for(UITouch *t in touches) 
     {
-        CGPoint touchLoc = [t locationInView:nil];
-        // TODO: Handle this based on orientation
-        Game::getInstance()->touchEvent(Touch::TOUCH_PRESS, touchLoc.y,  WINDOW_WIDTH - touchLoc.x, uniqueTouch);
+        CGPoint touchLoc = [t locationInView:self];
+        if(self.multipleTouchEnabled == YES) 
+            uniqueTouch = [t hash];
+        Game::getInstance()->touchEvent(Touch::TOUCH_PRESS, touchLoc.y,  touchLoc.x, uniqueTouch);
     }
 }
 
@@ -284,9 +317,10 @@ long getMachTimeInMilliseconds()
     unsigned int uniqueTouch = 0;
     for(UITouch* t in touches) 
     {
-        CGPoint touchLoc = [t locationInView:nil];
-        // TODO: Handle this based on orientation
-        Game::getInstance()->touchEvent(Touch::TOUCH_RELEASE, touchLoc.y, WINDOW_WIDTH - touchLoc.x, uniqueTouch);
+        CGPoint touchLoc = [t locationInView:self];
+        if(self.multipleTouchEnabled == YES) 
+            uniqueTouch = [t hash];
+        Game::getInstance()->touchEvent(Touch::TOUCH_RELEASE, touchLoc.y, touchLoc.x, uniqueTouch);
     }
 }
 
@@ -298,13 +332,13 @@ long getMachTimeInMilliseconds()
 
 - (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event 
 {
-    unsigned 
-    int uniqueTouch = 0;
+    unsigned int uniqueTouch = 0;
     for(UITouch* t in touches) 
     {
-        CGPoint touchLoc = [t locationInView:nil];
-        // TODO: Handle this based on orientation
-        Game::getInstance()->touchEvent(Touch::TOUCH_MOVE, touchLoc.y,  WINDOW_WIDTH - touchLoc.x, uniqueTouch);
+        CGPoint touchLoc = [t locationInView:self];
+        if(self.multipleTouchEnabled == YES) 
+            uniqueTouch = [t hash];
+        Game::getInstance()->touchEvent(Touch::TOUCH_MOVE, touchLoc.y,  touchLoc.x, uniqueTouch);
     }
 }
 
@@ -345,7 +379,7 @@ long getMachTimeInMilliseconds()
     self.view = [[[View alloc] init] autorelease];
     if(__view == nil) 
     {
-        __view = self.view;
+        __view = (View*)self.view;
     }
 }
 
@@ -380,6 +414,7 @@ long getMachTimeInMilliseconds()
 
 - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
 {
+    __appDelegate = self;
     [UIApplication sharedApplication].statusBarHidden = YES;
     UIAccelerometer*  accelerometer = [UIAccelerometer sharedAccelerometer];
     accelerometer.updateInterval = 1 / 40.0;    // 40Hz
@@ -438,6 +473,232 @@ long getMachTimeInMilliseconds()
 
 @end
 
+long getMachTimeInMilliseconds()
+{
+    static const int64_t kOneMillion = 1000 * 1000;
+    static mach_timebase_info_data_t s_timebase_info;
+    
+    if (s_timebase_info.denom == 0) 
+        (void) mach_timebase_info(&s_timebase_info);
+    
+    // mach_absolute_time() returns billionth of seconds, so divide by one million to get milliseconds
+    return (long)((mach_absolute_time() * s_timebase_info.numer) / (kOneMillion * s_timebase_info.denom));
+}
+
+int getKey(unichar keyCode) 
+{
+    switch(keyCode) {
+        case 0x30:
+            return Keyboard::KEY_ZERO;
+        case 0x31:
+            return Keyboard::KEY_ONE;
+        case 0x32:
+            return Keyboard::KEY_TWO;
+        case 0x33:
+            return Keyboard::KEY_THREE;
+        case 0x34:
+            return Keyboard::KEY_FOUR;
+        case 0x35:
+            return Keyboard::KEY_FIVE;
+        case 0x36:
+            return Keyboard::KEY_SIX;
+        case 0x37:
+            return Keyboard::KEY_SEVEN;
+        case 0x38:
+            return Keyboard::KEY_EIGHT;
+        case 0x39:
+            return Keyboard::KEY_NINE;
+            
+        case 0x41:
+            return Keyboard::KEY_CAPITAL_A;
+        case 0x42:
+            return Keyboard::KEY_CAPITAL_B;
+        case 0x43:
+            return Keyboard::KEY_CAPITAL_C;
+        case 0x44:
+            return Keyboard::KEY_CAPITAL_D;
+        case 0x45:
+            return Keyboard::KEY_CAPITAL_E;
+        case 0x46:
+            return Keyboard::KEY_CAPITAL_F;
+        case 0x47:
+            return Keyboard::KEY_CAPITAL_G;
+        case 0x48:
+            return Keyboard::KEY_CAPITAL_H;
+        case 0x49:
+            return Keyboard::KEY_CAPITAL_I;
+        case 0x4A:
+            return Keyboard::KEY_CAPITAL_J;
+        case 0x4B:
+            return Keyboard::KEY_CAPITAL_K;
+        case 0x4C:
+            return Keyboard::KEY_CAPITAL_L;
+        case 0x4D:
+            return Keyboard::KEY_CAPITAL_M;
+        case 0x4E:
+            return Keyboard::KEY_CAPITAL_N;
+        case 0x4F:
+            return Keyboard::KEY_CAPITAL_O;
+        case 0x50:
+            return Keyboard::KEY_CAPITAL_P;
+        case 0x51:
+            return Keyboard::KEY_CAPITAL_Q;
+        case 0x52:
+            return Keyboard::KEY_CAPITAL_R;
+        case 0x53:
+            return Keyboard::KEY_CAPITAL_S;
+        case 0x54:
+            return Keyboard::KEY_CAPITAL_T;
+        case 0x55:
+            return Keyboard::KEY_CAPITAL_U;
+        case 0x56:
+            return Keyboard::KEY_CAPITAL_V;
+        case 0x57:
+            return Keyboard::KEY_CAPITAL_W;
+        case 0x58:
+            return Keyboard::KEY_CAPITAL_X;
+        case 0x59:
+            return Keyboard::KEY_CAPITAL_Y;
+        case 0x5A:
+            return Keyboard::KEY_CAPITAL_Z;
+            
+            
+        case 0x61:
+            return Keyboard::KEY_A;
+        case 0x62:
+            return Keyboard::KEY_B;
+        case 0x63:
+            return Keyboard::KEY_C;
+        case 0x64:
+            return Keyboard::KEY_D;
+        case 0x65:
+            return Keyboard::KEY_E;
+        case 0x66:
+            return Keyboard::KEY_F;
+        case 0x67:
+            return Keyboard::KEY_G;
+        case 0x68:
+            return Keyboard::KEY_H;
+        case 0x69:
+            return Keyboard::KEY_I;
+        case 0x6A:
+            return Keyboard::KEY_J;
+        case 0x6B:
+            return Keyboard::KEY_K;
+        case 0x6C:
+            return Keyboard::KEY_L;
+        case 0x6D:
+            return Keyboard::KEY_M;
+        case 0x6E:
+            return Keyboard::KEY_N;
+        case 0x6F:
+            return Keyboard::KEY_O;
+        case 0x70:
+            return Keyboard::KEY_P;
+        case 0x71:
+            return Keyboard::KEY_Q;
+        case 0x72:
+            return Keyboard::KEY_R;
+        case 0x73:
+            return Keyboard::KEY_S;
+        case 0x74:
+            return Keyboard::KEY_T;
+        case 0x75:
+            return Keyboard::KEY_U;
+        case 0x76:
+            return Keyboard::KEY_V;
+        case 0x77:
+            return Keyboard::KEY_W;
+        case 0x78:
+            return Keyboard::KEY_X;
+        case 0x79:
+            return Keyboard::KEY_Y;
+        case 0x7A:
+            return Keyboard::KEY_Z;
+        default:
+            break;
+            
+       // Symbol Row 3
+        case 0x2E:
+            return Keyboard::KEY_PERIOD;
+        case 0x2C:
+            return Keyboard::KEY_COMMA;
+        case 0x3F:
+            return Keyboard::KEY_QUESTION;
+        case 0x21:
+            return Keyboard::KEY_EXCLAM;
+        case 0x27:
+            return Keyboard::KEY_APOSTROPHE;
+            
+        // Symbols Row 2
+        case 0x2D:
+            return Keyboard::KEY_MINUS;
+        case 0x2F:
+            return Keyboard::KEY_SLASH;
+        case 0x3A:
+            return Keyboard::KEY_COLON;
+        case 0x3B:
+            return Keyboard::KEY_SEMICOLON;
+        case 0x28:
+            return Keyboard::KEY_LEFT_PARENTHESIS;
+        case 0x29:
+            return Keyboard::KEY_RIGHT_PARENTHESIS;
+        case 0x24:
+            return Keyboard::KEY_DOLLAR;
+        case 0x26:
+            return Keyboard::KEY_AMPERSAND;
+        case 0x40:
+            return Keyboard::KEY_AT;
+        case 0x22:
+            return Keyboard::KEY_QUOTE;
+            
+        // Numeric Symbols Row 1
+        case 0x5B:
+            return Keyboard::KEY_LEFT_BRACKET;
+        case 0x5D:
+            return Keyboard::KEY_RIGHT_BRACKET;
+        case 0x7B:
+            return Keyboard::KEY_LEFT_BRACE;
+        case 0x7D:
+            return Keyboard::KEY_RIGHT_BRACE;
+        case 0x23:
+            return Keyboard::KEY_NUMBER;
+        case 0x25:
+            return Keyboard::KEY_PERCENT;
+        case 0x5E:
+            return Keyboard::KEY_CIRCUMFLEX;
+        case 0x2A:
+            return Keyboard::KEY_ASTERISK;
+        case 0x2B:
+            return Keyboard::KEY_PLUS;
+        case 0x3D:
+            return Keyboard::KEY_EQUAL;
+            
+        // Numeric Symbols Row 2
+        case 0x5F:
+            return Keyboard::KEY_UNDERSCORE;
+        case 0x5C:
+            return Keyboard::KEY_BACK_SLASH;
+        case 0x7C:
+            return Keyboard::KEY_BAR;
+        case 0x7E:
+            return Keyboard::KEY_TILDE;
+        case 0x3C:
+            return Keyboard::KEY_LESS_THAN;
+        case 0x3E:
+            return Keyboard::KEY_GREATER_THAN;
+        case 0x80:
+            return Keyboard::KEY_EURO;
+        case 0xA3:
+            return Keyboard::KEY_POUND;
+        case 0xA5:
+            return Keyboard::KEY_YEN;
+        case 0xB7:
+            return Keyboard::KEY_MIDDLE_DOT;
+    }
+    return Keyboard::KEY_NONE;
+}
+
 
 namespace gameplay
 {