diff --git a/engine/Makefile b/engine/Makefile
index 1aec84dcb..e23e386e9 100644
--- a/engine/Makefile
+++ b/engine/Makefile
@@ -60,9 +60,17 @@ ifeq ($(FTE_TARGET),droid)
NDK_PATH:=$(shell echo $(DROID_NDK_PATH))
SDK_PATH:=$(shell echo $(DROID_SDK_PATH))
+ DROID_API_LEVEL=3
+
+ #there are 3 ABI targets
+ #armv5 (works on all arm droids)
+ #armv7 (more common on 2.2+ droids)
+ #armv7+neon
+ DROID_ABI?=-mfloat-abi=softfp
+
STRIP=$(NDK_PATH)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-strip
- CC=$(NDK_PATH)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc -I$(NDK_PATH)/platforms/android-8/arch-arm/usr/include/ -DANDROID
- DO_LD=$(CC) -Wl,-soname,libftedroid.so -shared -Wl,--no-undefined -Wl,-z,noexecstack --sysroot=$(NDK_PATH)/platforms/android-8/arch-arm -L$(NDK_PATH)/platforms/android-8/arch-arm/usr/lib -o $@ $(LTO_LD) $(WCFLAGS) $(CFLAGS) -llog -lc -lz -lm
+ CC=$(NDK_PATH)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc -I$(NDK_PATH)/platforms/android-$(DROID_API_LEVEL)/arch-arm/usr/include/ -DANDROID $(DROID_ABI)
+ DO_LD=$(CC) -Wl,-soname,libftedroid.so -shared -Wl,--no-undefined -Wl,-z,noexecstack --sysroot=$(NDK_PATH)/platforms/android-$(DROID_API_LEVEL)/arch-arm -L$(NDK_PATH)/platforms/android-$(DROID_API_LEVEL)/arch-arm/usr/lib -o $@ $(LTO_LD) $(WCFLAGS) $(CFLAGS) -llog -lc -lz -lm
endif
#correct the gcc build when cross compiling
@@ -845,7 +853,7 @@ ifeq ($(FTE_TARGET),droid)
SV_LDFLAGS=
- GLCL_OBJS=$(GL_OBJS) $(GLQUAKE_OBJS) gl_viddroid.o sys_droid.o cd_null.o
+ GLCL_OBJS=$(GL_OBJS) $(GLQUAKE_OBJS) gl_viddroid.o sys_droid.o cd_null.o snd_droid.o
GL_LDFLAGS=$(GLLDFLAGS)
GLB_DIR=gl_droid
GL_EXE_NAME=../libftedroid.so
diff --git a/engine/client/cl_input.c b/engine/client/cl_input.c
index 10d1b046a..db8ba0ff8 100644
--- a/engine/client/cl_input.c
+++ b/engine/client/cl_input.c
@@ -1737,7 +1737,11 @@ void CL_InitInput (void)
Cmd_AddCommand (vahunk("p%i", sp+1), CL_Split_f);
Cmd_AddCommand (vahunk("+p%i", sp+1), CL_Split_f);
Cmd_AddCommand (vahunk("-p%i", sp+1), CL_Split_f);
+
+/*default mlook to pressed, unless on android where we expect a touch-screen and wouldn't be able to move forwards*/
+#ifndef ANDROID
in_mlook.state[sp] = 1;
+#endif
}
Cmd_AddCommand ("+moveup", IN_UpDown);
@@ -1774,7 +1778,7 @@ void CL_InitInput (void)
Cmd_AddCommand ("+klook", IN_KLookDown);
Cmd_AddCommand ("-klook", IN_KLookUp);
Cmd_AddCommand ("+mlook", IN_MLookDown);
- Cmd_AddCommand ("-mlooks", IN_MLookUp);
+ Cmd_AddCommand ("-mlook", IN_MLookUp);
Cmd_AddCommand ("+button3", IN_Button3Down);
Cmd_AddCommand ("-button3", IN_Button3Up);
diff --git a/engine/client/snd_dma.c b/engine/client/snd_dma.c
index 6c83651bb..3f8f3087a 100644
--- a/engine/client/snd_dma.c
+++ b/engine/client/snd_dma.c
@@ -620,6 +620,7 @@ sounddriver pOSS_InitCard;
sounddriver pMacOS_InitCard;
sounddriver pSDL_InitCard;
sounddriver pWAV_InitCard;
+sounddriver pDroid_InitCard;
sounddriver pAHI_InitCard;
typedef struct {
@@ -632,6 +633,7 @@ sdriver_t drivers[] = {
{"DSound", &pDSOUND_InitCard}, //prefered on windows
{"MacOS", &pMacOS_InitCard}, //prefered on mac
+ {"Droid", &pDroid_InitCard}, //prefered on android (java thread)
{"AHI", &pAHI_InitCard}, //prefered on morphos
{"SDL", &pSDL_InitCard}, //prefered on linux
diff --git a/engine/client/sys_droid.c b/engine/client/sys_droid.c
index 403755c41..ae1c005b5 100644
--- a/engine/client/sys_droid.c
+++ b/engine/client/sys_droid.c
@@ -46,7 +46,7 @@ JNIEXPORT void JNICALL Java_com_fteqw_FTEDroidEngine_init(JNIEnv *env, jobject o
if (!sys_running)
{
quakeparms_t parms;
- parms.basedir = "/sdcard";
+ parms.basedir = "/sdcard/fte";
parms.argc = 0;
parms.argv = NULL;
parms.memsize = sys_memheap = 8*1024*1024;
@@ -76,8 +76,9 @@ JNIEXPORT void JNICALL Java_com_fteqw_FTEDroidEngine_keypress(JNIEnv *env, jobje
Key_Event(0, keycode, unicode, down);
}
-float mousecursor_x, mousecursor_y;
+int mousecursor_x, mousecursor_y;
float mouse_x, mouse_y;
+static float omouse_x, omouse_y;
JNIEXPORT void JNICALL Java_com_fteqw_FTEDroidEngine_motion(JNIEnv *env, jobject obj,
jint act, jfloat x, jfloat y)
{
@@ -85,8 +86,10 @@ JNIEXPORT void JNICALL Java_com_fteqw_FTEDroidEngine_motion(JNIEnv *env, jobject
static qboolean down;
float dx, dy;
- dx = x - mousecursor_x;
- dy = y - mousecursor_y;
+ dx = x - omouse_x;
+ dy = y - omouse_y;
+ omouse_x = x;
+ omouse_y = y;
mousecursor_x = x;
mousecursor_y = y;
diff --git a/engine/droid/AndroidManifest.xml b/engine/droid/AndroidManifest.xml
index d5d98d155..510f52877 100644
--- a/engine/droid/AndroidManifest.xml
+++ b/engine/droid/AndroidManifest.xml
@@ -3,7 +3,7 @@
package="com.fteqw"
android:versionCode="1"
android:versionName="1.0">
-
+
@@ -17,4 +17,4 @@
-
\ No newline at end of file
+
diff --git a/engine/droid/src/com/fteqw/FTEDroidActivity.java b/engine/droid/src/com/fteqw/FTEDroidActivity.java
index 4da78abfb..b28171476 100644
--- a/engine/droid/src/com/fteqw/FTEDroidActivity.java
+++ b/engine/droid/src/com/fteqw/FTEDroidActivity.java
@@ -18,6 +18,10 @@ import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
+import android.media.AudioFormat;
+import android.media.AudioManager;
+import android.media.AudioTrack;
+
public class FTEDroidActivity extends Activity
{
private SensorManager sensorman;
@@ -50,6 +54,56 @@ public class FTEDroidActivity extends Activity
{
private final FTERenderer rndr;
+ private byte[] audbuf;
+ private AudioTrack at;
+
+ private void audioInit()
+ {
+ final int notifframes = 2048;
+ if (at != null)
+ at.stop();
+ int sspeed = 11025;
+ int speakers = 1;
+ int sz = 4*AudioTrack.getMinBufferSize(sspeed, ((speakers==2)?AudioFormat.CHANNEL_CONFIGURATION_STEREO:AudioFormat.CHANNEL_CONFIGURATION_MONO), AudioFormat.ENCODING_PCM_16BIT);
+ if (sz < notifframes*2)
+ sz = notifframes*2;
+
+ at = new AudioTrack(AudioManager.STREAM_MUSIC, sspeed, ((speakers==2)?AudioFormat.CHANNEL_CONFIGURATION_STEREO:AudioFormat.CHANNEL_CONFIGURATION_MONO), AudioFormat.ENCODING_PCM_16BIT, sz, AudioTrack.MODE_STREAM);
+ final int framesz = 2; /*mono 16bit*/
+ audbuf = new byte[notifframes*framesz];
+
+ at.setPlaybackPositionUpdateListener(new AudioTrack.OnPlaybackPositionUpdateListener()
+ {
+ @Override
+ public void onMarkerReached(AudioTrack track)
+ {
+ }
+ @Override
+ public void onPeriodicNotification(AudioTrack track)
+ {
+ int avail = FTEDroidEngine.paintaudio(audbuf, audbuf.length);
+ at.write(audbuf, 0, notifframes*framesz);
+ }
+ });
+ at.setPositionNotificationPeriod(notifframes);
+
+ at.setStereoVolume(1, 1);
+
+ at.play();
+ /*buffer needs to be completely full before it'll start playing*/
+ while(sz > 0)
+ {
+ at.write(audbuf, 0, notifframes*framesz);
+ sz -= notifframes;
+ }
+ }
+ public void resume()
+ {
+ /*poke audio into submission*/
+ if (at != null)
+ at.play();
+ }
+
public FTEView(Context context)
{
super(context);
@@ -58,6 +112,8 @@ public class FTEDroidActivity extends Activity
setRenderer(rndr);
setFocusable(true);
setFocusableInTouchMode(true);
+
+ audioInit();
}
private void sendKey(final boolean presseddown, final int qcode, final int unicode)
@@ -208,6 +264,8 @@ public class FTEDroidActivity extends Activity
{
super.onResume();
sensorman.registerListener((SensorEventListener)view, sensoracc, SensorManager.SENSOR_DELAY_GAME);
+
+ view.resume();
}
@Override
diff --git a/engine/droid/src/com/fteqw/FTEDroidEngine.java b/engine/droid/src/com/fteqw/FTEDroidEngine.java
index 17dc282fc..f0c20ad5f 100644
--- a/engine/droid/src/com/fteqw/FTEDroidEngine.java
+++ b/engine/droid/src/com/fteqw/FTEDroidEngine.java
@@ -7,6 +7,8 @@ public class FTEDroidEngine
public static native void keypress(int down, int qkey, int unicode);
public static native void motion(int act, float x, float y);
public static native void accelerometer(float x, float y, float z);
+ public static native int paintaudio(byte[] stream, int len);
+
static
{
System.loadLibrary("ftedroid");
diff --git a/engine/gl/glquake.h b/engine/gl/glquake.h
index a7c652ac6..37e7dc0ba 100644
--- a/engine/gl/glquake.h
+++ b/engine/gl/glquake.h
@@ -48,6 +48,9 @@ void ClearBounds (vec3_t mins, vec3_t maxs);
#if defined(ANDROID) /*FIXME: actually just to use standard GLES headers instead of full GL*/
#if 1
#include
+ #ifndef GL_CLIP_PLANE0
+ #define GL_CLIP_PLANE0 0x3000
+ #endif
#else
#include
/*gles has no fixed function*/