1cfd74d65d832137e20e193c960802afba73b5d38sm/* 23c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Copyright (C) 2010 The Android Open Source Project 3cfd74d65d832137e20e193c960802afba73b5d38sm * 4cfd74d65d832137e20e193c960802afba73b5d38sm * Licensed under the Apache License, Version 2.0 (the "License"); 5cfd74d65d832137e20e193c960802afba73b5d38sm * you may not use this file except in compliance with the License. 6cfd74d65d832137e20e193c960802afba73b5d38sm * You may obtain a copy of the License at 7cfd74d65d832137e20e193c960802afba73b5d38sm * 8cfd74d65d832137e20e193c960802afba73b5d38sm * http://www.apache.org/licenses/LICENSE-2.0 9cfd74d65d832137e20e193c960802afba73b5d38sm * 10cfd74d65d832137e20e193c960802afba73b5d38sm * Unless required by applicable law or agreed to in writing, software 11cfd74d65d832137e20e193c960802afba73b5d38sm * distributed under the License is distributed on an "AS IS" BASIS, 12cfd74d65d832137e20e193c960802afba73b5d38sm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cfd74d65d832137e20e193c960802afba73b5d38sm * See the License for the specific language governing permissions and 14cfd74d65d832137e20e193c960802afba73b5d38sm * limitations under the License. 15cfd74d65d832137e20e193c960802afba73b5d38sm */ 16cfd74d65d832137e20e193c960802afba73b5d38sm 17cfd74d65d832137e20e193c960802afba73b5d38smpackage com.replica.replicaisland; 18cfd74d65d832137e20e193c960802afba73b5d38sm 19cfd74d65d832137e20e193c960802afba73b5d38sm/** 20cfd74d65d832137e20e193c960802afba73b5d38sm * Manages input from a roller wheel and touch screen. Reduces frequent UI messages to 21cfd74d65d832137e20e193c960802afba73b5d38sm * an average direction over a short period of time. 22cfd74d65d832137e20e193c960802afba73b5d38sm */ 23cfd74d65d832137e20e193c960802afba73b5d38smpublic class InputSystem extends BaseObject { 242b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm private InputTouchScreen mTouchScreen = new InputTouchScreen(); 25cfd74d65d832137e20e193c960802afba73b5d38sm private InputXY mOrientationSensor = new InputXY(); 269d4cc2572d37983607df38b0f4216ed76ac51814sm private InputXY mTrackball = new InputXY(); 279d4cc2572d37983607df38b0f4216ed76ac51814sm private InputKeyboard mKeyboard = new InputKeyboard(); 282b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm private int mScreenRotation = 0; 292b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm private float mOrientationInput[] = new float[3]; 302b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm private float mOrientationOutput[] = new float[3]; 319d4cc2572d37983607df38b0f4216ed76ac51814sm 32cfd74d65d832137e20e193c960802afba73b5d38sm public InputSystem() { 33cfd74d65d832137e20e193c960802afba73b5d38sm super(); 34cfd74d65d832137e20e193c960802afba73b5d38sm reset(); 35cfd74d65d832137e20e193c960802afba73b5d38sm } 36cfd74d65d832137e20e193c960802afba73b5d38sm 37cfd74d65d832137e20e193c960802afba73b5d38sm @Override 38cfd74d65d832137e20e193c960802afba73b5d38sm public void reset() { 399d4cc2572d37983607df38b0f4216ed76ac51814sm mTrackball.reset(); 409d4cc2572d37983607df38b0f4216ed76ac51814sm mTouchScreen.reset(); 419d4cc2572d37983607df38b0f4216ed76ac51814sm mKeyboard.resetAll(); 429d4cc2572d37983607df38b0f4216ed76ac51814sm mOrientationSensor.reset(); 43cfd74d65d832137e20e193c960802afba73b5d38sm } 44cfd74d65d832137e20e193c960802afba73b5d38sm 45cfd74d65d832137e20e193c960802afba73b5d38sm public void roll(float x, float y) { 46cfd74d65d832137e20e193c960802afba73b5d38sm TimeSystem time = sSystemRegistry.timeSystem; 479d4cc2572d37983607df38b0f4216ed76ac51814sm mTrackball.press(time.getGameTime(), mTrackball.getX() + x, mTrackball.getY() + y); 48cfd74d65d832137e20e193c960802afba73b5d38sm } 49cfd74d65d832137e20e193c960802afba73b5d38sm 502b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm public void touchDown(int index, float x, float y) { 519d4cc2572d37983607df38b0f4216ed76ac51814sm ContextParameters params = sSystemRegistry.contextParameters; 529d4cc2572d37983607df38b0f4216ed76ac51814sm TimeSystem time = sSystemRegistry.timeSystem; 539d4cc2572d37983607df38b0f4216ed76ac51814sm // Change the origin of the touch location from the top-left to the bottom-left to match 549d4cc2572d37983607df38b0f4216ed76ac51814sm // OpenGL space. 559d4cc2572d37983607df38b0f4216ed76ac51814sm // TODO: UNIFY THIS SHIT 562b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm mTouchScreen.press(index, time.getGameTime(), x, params.gameHeight - y); 57cfd74d65d832137e20e193c960802afba73b5d38sm } 58cfd74d65d832137e20e193c960802afba73b5d38sm 592b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm public void touchUp(int index, float x, float y) { 609d4cc2572d37983607df38b0f4216ed76ac51814sm // TODO: record up location? 612b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm mTouchScreen.release(index); 62cfd74d65d832137e20e193c960802afba73b5d38sm } 63cfd74d65d832137e20e193c960802afba73b5d38sm 642b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 652b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm public void setOrientation(float x, float y, float z) { 662b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm // The order of orientation axes changes depending on the rotation of the screen. 672b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm // Some devices call landscape "ROTAION_90" (e.g. phones), while others call it 682b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm // "ROTATION_0" (e.g. tablets). So we need to adjust the axes from canonical 692b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm // space into screen space depending on the rotation of the screen from 702b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm // whatever this device calls "default." 712b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm mOrientationInput[0] = x; 722b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm mOrientationInput[1] = y; 732b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm mOrientationInput[2] = z; 742b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 752b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm canonicalOrientationToScreenOrientation(mScreenRotation, mOrientationInput, mOrientationOutput); 762b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 772b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm // Now we have screen space rotations around xyz. 782b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm final float horizontalMotion = mOrientationOutput[1] / 90.0f; 792b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm final float verticalMotion = mOrientationOutput[0] / 90.0f; 802b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 81cfd74d65d832137e20e193c960802afba73b5d38sm TimeSystem time = sSystemRegistry.timeSystem; 822b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm mOrientationSensor.press(time.getGameTime(), horizontalMotion, verticalMotion); 839d4cc2572d37983607df38b0f4216ed76ac51814sm 84cfd74d65d832137e20e193c960802afba73b5d38sm } 85cfd74d65d832137e20e193c960802afba73b5d38sm 869d4cc2572d37983607df38b0f4216ed76ac51814sm public void keyDown(int keycode) { 879d4cc2572d37983607df38b0f4216ed76ac51814sm TimeSystem time = sSystemRegistry.timeSystem; 88cfd74d65d832137e20e193c960802afba73b5d38sm final float gameTime = time.getGameTime(); 899d4cc2572d37983607df38b0f4216ed76ac51814sm mKeyboard.press(gameTime, keycode); 90cfd74d65d832137e20e193c960802afba73b5d38sm } 91cfd74d65d832137e20e193c960802afba73b5d38sm 929d4cc2572d37983607df38b0f4216ed76ac51814sm public void keyUp(int keycode) { 939d4cc2572d37983607df38b0f4216ed76ac51814sm mKeyboard.release(keycode); 94cfd74d65d832137e20e193c960802afba73b5d38sm } 95cfd74d65d832137e20e193c960802afba73b5d38sm 96cfd74d65d832137e20e193c960802afba73b5d38sm public void releaseAllKeys() { 979d4cc2572d37983607df38b0f4216ed76ac51814sm mTrackball.releaseX(); 989d4cc2572d37983607df38b0f4216ed76ac51814sm mTrackball.releaseY(); 992b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm mTouchScreen.resetAll(); 1009d4cc2572d37983607df38b0f4216ed76ac51814sm mKeyboard.releaseAll(); 1019d4cc2572d37983607df38b0f4216ed76ac51814sm mOrientationSensor.release(); 102cfd74d65d832137e20e193c960802afba73b5d38sm } 103cfd74d65d832137e20e193c960802afba73b5d38sm 1042b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm public InputTouchScreen getTouchScreen() { 1059d4cc2572d37983607df38b0f4216ed76ac51814sm return mTouchScreen; 1069d4cc2572d37983607df38b0f4216ed76ac51814sm } 107cfd74d65d832137e20e193c960802afba73b5d38sm 1089d4cc2572d37983607df38b0f4216ed76ac51814sm public InputXY getOrientationSensor() { 1099d4cc2572d37983607df38b0f4216ed76ac51814sm return mOrientationSensor; 1109d4cc2572d37983607df38b0f4216ed76ac51814sm } 111cfd74d65d832137e20e193c960802afba73b5d38sm 1129d4cc2572d37983607df38b0f4216ed76ac51814sm public InputXY getTrackball() { 1139d4cc2572d37983607df38b0f4216ed76ac51814sm return mTrackball; 1149d4cc2572d37983607df38b0f4216ed76ac51814sm } 115cfd74d65d832137e20e193c960802afba73b5d38sm 1169d4cc2572d37983607df38b0f4216ed76ac51814sm public InputKeyboard getKeyboard() { 1179d4cc2572d37983607df38b0f4216ed76ac51814sm return mKeyboard; 1189d4cc2572d37983607df38b0f4216ed76ac51814sm } 1192b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 1202b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm public void setScreenRotation(int rotation) { 1212b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm mScreenRotation = rotation; 1222b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm } 123cfd74d65d832137e20e193c960802afba73b5d38sm 1242b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm // Thanks to NVIDIA for this useful canonical-to-screen orientation function. 1252b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm // More here: http://developer.download.nvidia.com/tegra/docs/tegra_android_accelerometer_v5f.pdf 1262b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm static void canonicalOrientationToScreenOrientation( 1272b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm int displayRotation, float[] canVec, float[] screenVec) { 1282b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm final int axisSwap[][] = { 1292b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm { 1, -1, 0, 1 }, // ROTATION_0 1302b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm {-1, -1, 1, 0 }, // ROTATION_90 1312b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm {-1, 1, 0, 1 }, // ROTATION_180 1322b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm { 1, 1, 1, 0 } }; // ROTATION_270 1332b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 1342b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm final int[] as = axisSwap[displayRotation]; 1352b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm screenVec[0] = (float)as[0] * canVec[ as[2] ]; 1362b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm screenVec[1] = (float)as[1] * canVec[ as[3] ]; 1372b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm screenVec[2] = canVec[2]; 1382b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm } 1392b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm 140cfd74d65d832137e20e193c960802afba73b5d38sm 141cfd74d65d832137e20e193c960802afba73b5d38sm 142cfd74d65d832137e20e193c960802afba73b5d38sm} 143