/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.replica.replicaisland; /** * Manages input from a roller wheel and touch screen. Reduces frequent UI messages to * an average direction over a short period of time. */ public class InputSystem extends BaseObject { private InputTouchScreen mTouchScreen = new InputTouchScreen(); private InputXY mOrientationSensor = new InputXY(); private InputXY mTrackball = new InputXY(); private InputKeyboard mKeyboard = new InputKeyboard(); private int mScreenRotation = 0; private float mOrientationInput[] = new float[3]; private float mOrientationOutput[] = new float[3]; public InputSystem() { super(); reset(); } @Override public void reset() { mTrackball.reset(); mTouchScreen.reset(); mKeyboard.resetAll(); mOrientationSensor.reset(); } public void roll(float x, float y) { TimeSystem time = sSystemRegistry.timeSystem; mTrackball.press(time.getGameTime(), mTrackball.getX() + x, mTrackball.getY() + y); } public void touchDown(int index, float x, float y) { ContextParameters params = sSystemRegistry.contextParameters; TimeSystem time = sSystemRegistry.timeSystem; // Change the origin of the touch location from the top-left to the bottom-left to match // OpenGL space. // TODO: UNIFY THIS SHIT mTouchScreen.press(index, time.getGameTime(), x, params.gameHeight - y); } public void touchUp(int index, float x, float y) { // TODO: record up location? mTouchScreen.release(index); } public void setOrientation(float x, float y, float z) { // The order of orientation axes changes depending on the rotation of the screen. // Some devices call landscape "ROTAION_90" (e.g. phones), while others call it // "ROTATION_0" (e.g. tablets). So we need to adjust the axes from canonical // space into screen space depending on the rotation of the screen from // whatever this device calls "default." mOrientationInput[0] = x; mOrientationInput[1] = y; mOrientationInput[2] = z; canonicalOrientationToScreenOrientation(mScreenRotation, mOrientationInput, mOrientationOutput); // Now we have screen space rotations around xyz. final float horizontalMotion = mOrientationOutput[1] / 90.0f; final float verticalMotion = mOrientationOutput[0] / 90.0f; TimeSystem time = sSystemRegistry.timeSystem; mOrientationSensor.press(time.getGameTime(), horizontalMotion, verticalMotion); } public void keyDown(int keycode) { TimeSystem time = sSystemRegistry.timeSystem; final float gameTime = time.getGameTime(); mKeyboard.press(gameTime, keycode); } public void keyUp(int keycode) { mKeyboard.release(keycode); } public void releaseAllKeys() { mTrackball.releaseX(); mTrackball.releaseY(); mTouchScreen.resetAll(); mKeyboard.releaseAll(); mOrientationSensor.release(); } public InputTouchScreen getTouchScreen() { return mTouchScreen; } public InputXY getOrientationSensor() { return mOrientationSensor; } public InputXY getTrackball() { return mTrackball; } public InputKeyboard getKeyboard() { return mKeyboard; } public void setScreenRotation(int rotation) { mScreenRotation = rotation; } // Thanks to NVIDIA for this useful canonical-to-screen orientation function. // More here: http://developer.download.nvidia.com/tegra/docs/tegra_android_accelerometer_v5f.pdf static void canonicalOrientationToScreenOrientation( int displayRotation, float[] canVec, float[] screenVec) { final int axisSwap[][] = { { 1, -1, 0, 1 }, // ROTATION_0 {-1, -1, 1, 0 }, // ROTATION_90 {-1, 1, 0, 1 }, // ROTATION_180 { 1, 1, 1, 0 } }; // ROTATION_270 final int[] as = axisSwap[displayRotation]; screenVec[0] = (float)as[0] * canVec[ as[2] ]; screenVec[1] = (float)as[1] * canVec[ as[3] ]; screenVec[2] = canVec[2]; } }