Home | History | Annotate | Download | only in replicaisland
      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 
     32     public InputSystem() {
     33         super();
     34         reset();
     35     }
     36 
     37     @Override
     38     public void reset() {
     39     	mTrackball.reset();
     40     	mTouchScreen.reset();
     41     	mKeyboard.resetAll();
     42     	mOrientationSensor.reset();
     43     }
     44 
     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 
     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 
     59     public void touchUp(int index, float x, float y) {
     60     	// TODO: record up location?
     61     	mTouchScreen.release(index);
     62     }
     63 
     64 
     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 
     86     public void keyDown(int keycode) {
     87     	TimeSystem time = sSystemRegistry.timeSystem;
     88         final float gameTime = time.getGameTime();
     89         mKeyboard.press(gameTime, keycode);
     90     }
     91 
     92     public void keyUp(int keycode) {
     93     	mKeyboard.release(keycode);
     94     }
     95 
     96     public void releaseAllKeys() {
     97     	mTrackball.releaseX();
     98     	mTrackball.releaseY();
     99     	mTouchScreen.resetAll();
    100     	mKeyboard.releaseAll();
    101     	mOrientationSensor.release();
    102     }
    103 
    104 	public InputTouchScreen getTouchScreen() {
    105 		return mTouchScreen;
    106 	}
    107 
    108 	public InputXY getOrientationSensor() {
    109 		return mOrientationSensor;
    110 	}
    111 
    112 	public InputXY getTrackball() {
    113 		return mTrackball;
    114 	}
    115 
    116 	public InputKeyboard getKeyboard() {
    117 		return mKeyboard;
    118 	}
    119 
    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
    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