1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.replica.replicaisland; 18 19 /** 20 * Manages input from a roller wheel and touch screen. Reduces frequent UI messages to 21 * an average direction over a short period of time. 22 */ 23 public class InputSystem extends BaseObject { 24 private InputTouchScreen mTouchScreen = new InputTouchScreen(); 25 private InputXY mOrientationSensor = new InputXY(); 26 private InputXY mTrackball = new InputXY(); 27 private InputKeyboard mKeyboard = new InputKeyboard(); 28 private int mScreenRotation = 0; 29 private float mOrientationInput[] = new float[3]; 30 private float mOrientationOutput[] = new float[3]; 31 InputSystem()32 public InputSystem() { 33 super(); 34 reset(); 35 } 36 37 @Override reset()38 public void reset() { 39 mTrackball.reset(); 40 mTouchScreen.reset(); 41 mKeyboard.resetAll(); 42 mOrientationSensor.reset(); 43 } 44 roll(float x, float y)45 public void roll(float x, float y) { 46 TimeSystem time = sSystemRegistry.timeSystem; 47 mTrackball.press(time.getGameTime(), mTrackball.getX() + x, mTrackball.getY() + y); 48 } 49 touchDown(int index, float x, float y)50 public void touchDown(int index, float x, float y) { 51 ContextParameters params = sSystemRegistry.contextParameters; 52 TimeSystem time = sSystemRegistry.timeSystem; 53 // Change the origin of the touch location from the top-left to the bottom-left to match 54 // OpenGL space. 55 // TODO: UNIFY THIS SHIT 56 mTouchScreen.press(index, time.getGameTime(), x, params.gameHeight - y); 57 } 58 touchUp(int index, float x, float y)59 public void touchUp(int index, float x, float y) { 60 // TODO: record up location? 61 mTouchScreen.release(index); 62 } 63 64 setOrientation(float x, float y, float z)65 public void setOrientation(float x, float y, float z) { 66 // The order of orientation axes changes depending on the rotation of the screen. 67 // Some devices call landscape "ROTAION_90" (e.g. phones), while others call it 68 // "ROTATION_0" (e.g. tablets). So we need to adjust the axes from canonical 69 // space into screen space depending on the rotation of the screen from 70 // whatever this device calls "default." 71 mOrientationInput[0] = x; 72 mOrientationInput[1] = y; 73 mOrientationInput[2] = z; 74 75 canonicalOrientationToScreenOrientation(mScreenRotation, mOrientationInput, mOrientationOutput); 76 77 // Now we have screen space rotations around xyz. 78 final float horizontalMotion = mOrientationOutput[1] / 90.0f; 79 final float verticalMotion = mOrientationOutput[0] / 90.0f; 80 81 TimeSystem time = sSystemRegistry.timeSystem; 82 mOrientationSensor.press(time.getGameTime(), horizontalMotion, verticalMotion); 83 84 } 85 keyDown(int keycode)86 public void keyDown(int keycode) { 87 TimeSystem time = sSystemRegistry.timeSystem; 88 final float gameTime = time.getGameTime(); 89 mKeyboard.press(gameTime, keycode); 90 } 91 keyUp(int keycode)92 public void keyUp(int keycode) { 93 mKeyboard.release(keycode); 94 } 95 releaseAllKeys()96 public void releaseAllKeys() { 97 mTrackball.releaseX(); 98 mTrackball.releaseY(); 99 mTouchScreen.resetAll(); 100 mKeyboard.releaseAll(); 101 mOrientationSensor.release(); 102 } 103 getTouchScreen()104 public InputTouchScreen getTouchScreen() { 105 return mTouchScreen; 106 } 107 getOrientationSensor()108 public InputXY getOrientationSensor() { 109 return mOrientationSensor; 110 } 111 getTrackball()112 public InputXY getTrackball() { 113 return mTrackball; 114 } 115 getKeyboard()116 public InputKeyboard getKeyboard() { 117 return mKeyboard; 118 } 119 setScreenRotation(int rotation)120 public void setScreenRotation(int rotation) { 121 mScreenRotation = rotation; 122 } 123 124 // Thanks to NVIDIA for this useful canonical-to-screen orientation function. 125 // More here: http://developer.download.nvidia.com/tegra/docs/tegra_android_accelerometer_v5f.pdf canonicalOrientationToScreenOrientation( int displayRotation, float[] canVec, float[] screenVec)126 static void canonicalOrientationToScreenOrientation( 127 int displayRotation, float[] canVec, float[] screenVec) { 128 final int axisSwap[][] = { 129 { 1, -1, 0, 1 }, // ROTATION_0 130 {-1, -1, 1, 0 }, // ROTATION_90 131 {-1, 1, 0, 1 }, // ROTATION_180 132 { 1, 1, 1, 0 } }; // ROTATION_270 133 134 final int[] as = axisSwap[displayRotation]; 135 screenVec[0] = (float)as[0] * canVec[ as[2] ]; 136 screenVec[1] = (float)as[1] * canVec[ as[3] ]; 137 screenVec[2] = canVec[2]; 138 } 139 140 141 142 } 143