1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * Copyright (C) 2007 The Android Open Source Project 3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * 4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * Licensed under the Apache License, Version 2.0 (the "License"); 5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * you may not use this file except in compliance with the License. 6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * You may obtain a copy of the License at 7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * 8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * http://www.apache.org/licenses/LICENSE-2.0 9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * 10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * Unless required by applicable law or agreed to in writing, software 11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * distributed under the License is distributed on an "AS IS" BASIS, 12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * See the License for the specific language governing permissions and 14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * limitations under the License. 15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich */ 16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichpackage com.android.quake; 18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/* 19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * Copyright (C) 2008 The Android Open Source Project 20cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * 21cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * Licensed under the Apache License, Version 2.0 (the "License"); 22cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * you may not use this file except in compliance with the License. 23cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * You may obtain a copy of the License at 24cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * 25cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * http://www.apache.org/licenses/LICENSE-2.0 26cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * 27cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * Unless required by applicable law or agreed to in writing, software 28cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * distributed under the License is distributed on an "AS IS" BASIS, 29cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 30cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * See the License for the specific language governing permissions and 31cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * limitations under the License. 32cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich */ 33cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 34cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 35cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichimport android.content.Context; 36cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichimport android.opengl.GLSurfaceView; 37cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichimport android.util.AttributeSet; 38cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichimport android.util.Log; 39cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichimport android.view.KeyEvent; 40cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichimport android.view.MotionEvent; 41cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 42cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichimport javax.microedition.khronos.egl.EGL10; 43cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichimport javax.microedition.khronos.egl.EGLConfig; 44cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichimport javax.microedition.khronos.opengles.GL10; 45cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/** 46cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * An implementation of SurfaceView that uses the dedicated surface for 47cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * displaying an OpenGL animation. This allows the animation to run in a 48cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * separate thread, without requiring that it be driven by the update mechanism 49cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * of the view hierarchy. 50cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * 51cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * The application-specific rendering code is delegated to a GLView.Renderer 52cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich * instance. 53cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich */ 54cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichclass QuakeView extends GLSurfaceView { 55cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich QuakeView(Context context) { 56cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich super(context); 57cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich init(); 58cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 59cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 60cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich public QuakeView(Context context, AttributeSet attrs) { 61cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich super(context, attrs); 62cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich init(); 63cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 64cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 65cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich private void init() { 66cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // We want events. 67cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich setFocusable(true); 68cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich setFocusableInTouchMode(true); 69cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich requestFocus(); 70cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 71cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 72cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich public void setQuakeLib(QuakeLib quakeLib) { 73cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mQuakeLib = quakeLib; 74cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich setRenderer(new QuakeRenderer()); 75cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 76cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 77cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich @Override 78cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich public boolean onKeyDown(int keyCode, KeyEvent event) { 79cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!weWantThisKeyCode(keyCode)) { 80cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return super.onKeyDown(keyCode, event); 81cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 82cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich switch (keyCode) { 83cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case KeyEvent.KEYCODE_ALT_RIGHT: 84cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case KeyEvent.KEYCODE_ALT_LEFT: 85cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mAltKeyPressed = true; 86cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 87cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case KeyEvent.KEYCODE_SHIFT_RIGHT: 88cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case KeyEvent.KEYCODE_SHIFT_LEFT: 89cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mShiftKeyPressed = true; 90cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 91cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 92cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich queueKeyEvent(QuakeLib.KEY_PRESS, 93cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich keyCodeToQuakeCode(keyCode)); 94cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return true; 95cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 96cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 97cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich @Override 98cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich public boolean onKeyUp(int keyCode, KeyEvent event) { 99cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!weWantThisKeyCode(keyCode)) { 100cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return super.onKeyUp(keyCode, event); 101cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 102cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich switch (keyCode) { 103cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case KeyEvent.KEYCODE_ALT_RIGHT: 104cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case KeyEvent.KEYCODE_ALT_LEFT: 105cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mAltKeyPressed = false; 106cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; 107cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case KeyEvent.KEYCODE_SHIFT_RIGHT: 108cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich case KeyEvent.KEYCODE_SHIFT_LEFT: 109cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mShiftKeyPressed = false; 110cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich break; } 111cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich queueKeyEvent(QuakeLib.KEY_RELEASE, 112cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich keyCodeToQuakeCode(keyCode)); 113cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return true; 114cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 115cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 116cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich @Override 117cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich public boolean onTrackballEvent(MotionEvent event) { 118cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (!mGameMode) { 119cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return super.onTrackballEvent(event); 120cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 121cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich queueTrackballEvent(event); 122cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return true; 123cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 124cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 125cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich private boolean weWantThisKeyCode(int keyCode) { 126cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return (keyCode != KeyEvent.KEYCODE_VOLUME_UP) && 127cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich (keyCode != KeyEvent.KEYCODE_VOLUME_DOWN) && 128cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich (keyCode != KeyEvent.KEYCODE_SEARCH); 129cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 130cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 131cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich @Override 132cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich public boolean dispatchTouchEvent(MotionEvent ev) { 133cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich queueMotionEvent(ev); 134cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return true; 135cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 136cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 137cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich private int keyCodeToQuakeCode(int keyCode) { 138cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich int key = 0; 13957a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich if (keyCode >= sKeyCodeToQuakeCode.length) { 140cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return 0; 141cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 142cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (mAltKeyPressed) { 143cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich key = sKeyCodeToQuakeCodeAlt[keyCode]; 144cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (key == 0) { 145cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich key = sKeyCodeToQuakeCodeShift[keyCode]; 146cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (key == 0) { 147cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich key = sKeyCodeToQuakeCode[keyCode]; 148cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 149cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 150cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } else if (mShiftKeyPressed) { 151cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich key = sKeyCodeToQuakeCodeShift[keyCode]; 152cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (key == 0) { 153cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich key = sKeyCodeToQuakeCode[keyCode]; 154cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 155cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } else { 156cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich key = sKeyCodeToQuakeCode[keyCode]; 157cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 158cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (key == 0) { 159cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich key = '$'; 160cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 161cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich return key; 162cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 163cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 164cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich public void queueKeyEvent(final int type, final int keyCode) { 165cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich queueEvent( 166cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich new Runnable() { 167cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich public void run() { 168cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mQuakeLib.event(type, keyCode); 169cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 170cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich }); 171cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 172cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 173cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich public void queueMotionEvent(final MotionEvent ev) { 174cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich queueEvent( 175cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich new Runnable() { 176cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich public void run() { 177cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mQuakeLib.motionEvent(ev.getEventTime(), 178cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ev.getAction(), 179cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ev.getX(), ev.getY(), 180cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ev.getPressure(), ev.getSize(), 181cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ev.getDeviceId()); 182cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 183cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich }); 184cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 185cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 186cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich public void queueTrackballEvent(final MotionEvent ev) { 187cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich queueEvent( 188cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich new Runnable() { 189cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich public void run() { 190cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mQuakeLib.trackballEvent(ev.getEventTime(), 191cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ev.getAction(), 192cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ev.getX(), ev.getY()); 193cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 194cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich }); 195cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 196cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 197cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich private boolean mShiftKeyPressed; 198cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich private boolean mAltKeyPressed; 199cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 200cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich private static final int[] sKeyCodeToQuakeCode = { 201cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '$', QuakeLib.K_ESCAPE, '$', '$', QuakeLib.K_ESCAPE, '$', '$', '0', // 0.. 7 202cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '1', '2', '3', '4', '5', '6', '7', '8', // 8..15 203cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '9', '$', '$', QuakeLib.K_UPARROW, QuakeLib.K_DOWNARROW, QuakeLib.K_LEFTARROW, QuakeLib.K_RIGHTARROW, QuakeLib.K_ENTER, // 16..23 204cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '$', '$', '$', QuakeLib.K_HOME, '$', 'a', 'b', 'c', // 24..31 205cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 206cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', // 32..39 207cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', // 40..47 208cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 't', 'u', 'v', 'w', 'x', 'y', 'z', ',', // 48..55 209cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '.', QuakeLib.K_ALT, QuakeLib.K_ALT, QuakeLib.K_SHIFT, QuakeLib.K_SHIFT, QuakeLib.K_TAB, ' ', '$', // 56..63 210cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '$', '$', QuakeLib.K_ENTER, QuakeLib.K_BACKSPACE, '`', '-', '=', '[', // 64..71 211cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich ']', '\\', ';', '\'', '/', QuakeLib.K_CTRL, '#', '$', // 72..79 21257a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich QuakeLib.K_HOME, '$', QuakeLib.K_ESCAPE, '$', '$', 0, 0, 0, 0, // 80.. 21357a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, QuakeLib.K_PGUP, QuakeLib.K_PGDN, 0, 0, 0, 0, 0, 0, // 90.. 21457a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 100.. 21557a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, QuakeLib.K_ESCAPE, QuakeLib.K_DEL, QuakeLib.K_CTRL, QuakeLib.K_CTRL, 0, 0, 0, 0, 0, // 110.. 21657a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, QuakeLib.K_HOME, QuakeLib.K_END, QuakeLib.K_INS, 0, 0, 0, 0, 0, // 120.. 21757a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, QuakeLib.K_F1, QuakeLib.K_F2, QuakeLib.K_F3, QuakeLib.K_F4, // 130..134 21857a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich QuakeLib.K_F5, QuakeLib.K_F6, QuakeLib.K_F7, QuakeLib.K_F8, QuakeLib.K_F9, // 135..139 21957a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich QuakeLib.K_F10, QuakeLib.K_F11, QuakeLib.K_F12, 0, 0, 0, 0, 0, 0, 0, // 140.. 22057a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 150.. 22157a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160 22257a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 170.. 22357a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 180.. 224cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich }; 225cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 226cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich private static final int sKeyCodeToQuakeCodeShift[] = 227cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 228cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, ')', // 0.. 7 229cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '!', '@', '#', '$', '%', '^', '&', '*', // 8..15 230cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '(', 0, 0, 0, 0, 0, 0, 0, // 16..23 231cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, ']', 0, // 24..31 232cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 233cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '\\', '_', '{', '}', ':', '-', ';', '"', // 32..39 234cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich '\'', '>', '<', '+', '=', 0, 0, '|', // 40..47 235cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, '[', '`', 0, 0, QuakeLib.K_PAUSE, ';', // 48..55 236cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 56..63 237cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 64..71 238cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, '?', '0', 0, QuakeLib.K_CTRL, 0, 0, // 72..79 23957a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 80.. 24057a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, QuakeLib.K_PGUP, QuakeLib.K_PGDN, 0, 0, 0, 0, 0, 0, // 90.. 24157a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 100.. 24257a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, QuakeLib.K_ESCAPE, QuakeLib.K_DEL, QuakeLib.K_CTRL, QuakeLib.K_CTRL, 0, 0, 0, 0, 0, // 110.. 24357a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, QuakeLib.K_HOME, QuakeLib.K_END, QuakeLib.K_INS, 0, 0, 0, 0, 0, // 120.. 24457a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, QuakeLib.K_F1, QuakeLib.K_F2, QuakeLib.K_F3, QuakeLib.K_F4, // 130..134 24557a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich QuakeLib.K_F5, QuakeLib.K_F6, QuakeLib.K_F7, QuakeLib.K_F8, QuakeLib.K_F9, // 135..139 24657a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich QuakeLib.K_F10, QuakeLib.K_F11, QuakeLib.K_F12, 0, 0, 0, 0, 0, 0, 0, // 140.. 24757a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 150.. 24857a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160 24957a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 170.. 25057a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 180.. 251cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich }; 252cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 253cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich private static final int sKeyCodeToQuakeCodeAlt[] = 254cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich { 255cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, QuakeLib.K_F10, // 0.. 7 256cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich QuakeLib.K_F1, QuakeLib.K_F2, QuakeLib.K_F3, QuakeLib.K_F4, QuakeLib.K_F5, QuakeLib.K_F6, QuakeLib.K_F7, QuakeLib.K_F8, // 8..15 257cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich QuakeLib.K_F9, 0, 0, 0, 0, 0, 0, 0, // 16..23 258cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 24..31 259cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 260cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 32..39 261cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 40..47 262cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich QuakeLib.K_F11, 0, 0, 0, 0, QuakeLib.K_F12, 0, 0, // 48..55 263cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 56..63 264cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 64..71 265cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, // 72..79 26657a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, 0, // 80.. 26757a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, QuakeLib.K_PGUP, QuakeLib.K_PGDN, 0, 0, 0, 0, 0, 0, // 90.. 26857a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 100.. 26957a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, QuakeLib.K_ESCAPE, QuakeLib.K_DEL, QuakeLib.K_CTRL, QuakeLib.K_CTRL, 0, 0, 0, 0, 0, // 110.. 27057a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, QuakeLib.K_HOME, QuakeLib.K_END, QuakeLib.K_INS, 0, 0, 0, 0, 0, // 120.. 27157a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, QuakeLib.K_F1, QuakeLib.K_F2, QuakeLib.K_F3, QuakeLib.K_F4, // 130..134 27257a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich QuakeLib.K_F5, QuakeLib.K_F6, QuakeLib.K_F7, QuakeLib.K_F8, QuakeLib.K_F9, // 135..139 27357a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich QuakeLib.K_F10, QuakeLib.K_F11, QuakeLib.K_F12, 0, 0, 0, 0, 0, 0, 0, // 140.. 27457a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 150.. 27557a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 160 27657a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 170.. 27757a781f2c3ddfdf8930f37dfa4f531d65569ed70Jack Palevich 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // 180.. 278cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich }; 279cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 280cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich private class QuakeRenderer implements GLSurfaceView.Renderer { 281cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich private static final String TAG = "QuakeRenderer"; 282cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich public void onDrawFrame(GL10 gl) { 283cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich if (mWidth != 0 && mHeight != 0) { 284cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mGameMode = mQuakeLib.step(mWidth, mHeight); 285cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 286cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 287cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 288cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich public void onSurfaceChanged(GL10 gl, int width, int height) { 289cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mWidth = width; 290cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mHeight = height; 291cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich mQuakeLib.init(); 292cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 293cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 294cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich public void onSurfaceCreated(GL10 gl, EGLConfig config) { 295cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich // Do nothing. 296cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 297cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich private int mWidth; 298cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich private int mHeight; 299cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich } 300cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 301cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich private QuakeLib mQuakeLib; 302cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich private boolean mGameMode; 303cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich} 304cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich 305