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