Subversion Repositories eduke32

Compare Revisions

Ignore whitespace Rev 4433 → Rev 4434

/polymer/eduke32/source/android/android-jni.cpp
11,11 → 11,15
#include <android/log.h>
 
#include "SDL_scancode.h"
#include "SDL_main.h"
 
#include "TouchControlsContainer.h"
#include "JNITouchControlsUtils.h"
 
extern "C"
{
 
extern void SDL_Android_Init(JNIEnv* env, jclass cls);
//This is a new function I put into SDL2, file SDL_androidgl.c
extern void SDL_SetSwapBufferCallBack(void (*pt2Func)(void));
 
38,8 → 42,9
 
int android_screen_width;
int android_screen_height;
int android_sample_rate;
int android_audio_buffer_size;
 
 
#define KEY_QUICK_CMD 0x1005
#define KEY_SHOW_KBRD 0x1008
#define KEY_SHOW_INVEN 0x1009
51,14 → 56,13
#define KEY_QUICK_KEY3 0x1013
#define KEY_QUICK_KEY4 0x1014
 
float gameControlsAlpha = 0.5;
 
float gameControlsAlpha = 0.5;
bool showWeaponCycle = false;
bool turnMouseMode = true;
bool invertLook = false;
bool precisionShoot = false;
bool showSticks = true;
bool hideTouchControls = true;
bool toggleCrouch = true;
 
bool shooting = false;
 
78,129 → 82,97
touchcontrols::WheelSelect *weaponWheel;
 
extern JNIEnv* env_;
JavaVM* jvm_;
 
void openGLStart()
{
if (curRenderer == REND_GL)
{
glPushMatrix();
 
if (curRenderer == REND_GL)
{
glPushMatrix();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof (0, android_screen_width, android_screen_height, 0, 0, 1);
 
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof (0, android_screen_width, android_screen_height, 0, 0, 1);
//glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
//glClear(GL_COLOR_BUFFER_BIT);
//LOGI("openGLStart");
glDisable(GL_ALPHA_TEST);
glDisable(GL_DEPTH_TEST);
glDisable(GL_FOG);
glEnable(GL_TEXTURE_2D);
glEnable (GL_BLEND);
 
//glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
//glClear(GL_COLOR_BUFFER_BIT);
//LOGI("openGLStart");
glDisable(GL_ALPHA_TEST);
glDisable(GL_DEPTH_TEST);
glDisable(GL_FOG);
glEnable(GL_TEXTURE_2D);
glEnable (GL_BLEND);
glColor4f(1,1,1,1);
 
glColor4f(1,1,1,1);
glDisableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY );
 
glDisableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY );
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_CULL_FACE);
 
glDisable(GL_CULL_FACE);
glMatrixMode(GL_MODELVIEW);
 
glMatrixMode(GL_MODELVIEW);
nanoPushState();
}
else //software mode
{
glDisable(GL_ALPHA_TEST);
glDisableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY );
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable (GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_2D);
glDisable(GL_CULL_FACE);
glMatrixMode(GL_MODELVIEW);
}
 
nanoPushState();
}
else //software mode
{
 
glDisable(GL_ALPHA_TEST);
glDisableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY );
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable (GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_2D);
glDisable(GL_CULL_FACE);
glMatrixMode(GL_MODELVIEW);
 
}
 
}
 
void openGLEnd()
{
 
if (curRenderer == REND_GL)
{
//glPopMatrix();
nanoPopState();
glPopMatrix();
}
else// Software mode
{
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glMatrixMode(GL_MODELVIEW);
 
}
if (curRenderer == REND_GL)
{
//glPopMatrix();
nanoPopState();
glPopMatrix();
}
else// Software mode
{
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glMatrixMode(GL_MODELVIEW);
}
}
 
void gameSettingsButton(int state)
{
 
//LOGTOUCH("gameSettingsButton %d",state);
if (state == 1)
{
jclass helloWorldClass;
jmethodID mainMethod;
 
helloWorldClass = env_->FindClass("com/beloko/duke/QuakeTouchControlsSettings");
mainMethod = env_->GetStaticMethodID(helloWorldClass, "showSettings", "()V");
env_->CallStaticVoidMethod(helloWorldClass, mainMethod);
}
if (state == 1)
{
showTouchSettings();
}
}
 
 
void showCustomCommands()
{
 
jclass helloWorldClass;
jmethodID mainMethod;
helloWorldClass = env_->FindClass("com/beloko/duke/QuakeCustomCommands");
mainMethod = env_->GetStaticMethodID(helloWorldClass, "showCommands", "()V");
env_->CallStaticVoidMethod(helloWorldClass, mainMethod);
}
 
void toggleKeyboard()
{
LOGI("toggleKeyboard");
jclass helloWorldClass;
jmethodID mainMethod;
helloWorldClass = env_->FindClass("com/beloko/duke/ShowKeyboard");
mainMethod = env_->GetStaticMethodID(helloWorldClass, "toggleKeyboard", "()V");
env_->CallStaticVoidMethod(helloWorldClass, mainMethod);
}
 
//Because there is no Frame(), we need to check back to java each frame to see if the app hase paused
 
static jclass NativeLibClass = 0;
static jmethodID checkPauseMethod = 0;
 
void swapBuffers()
{
if (NativeLibClass == 0)
{
NativeLibClass = env_->FindClass("com/beloko/duke/engine/NativeLib");
checkPauseMethod = env_->GetStaticMethodID(NativeLibClass, "swapBuffers", "()V");
}
env_->CallStaticVoidMethod(NativeLibClass, checkPauseMethod);
if (NativeLibClass == 0)
{
NativeLibClass = env_->FindClass("com/beloko/duke/engine/NativeLib");
checkPauseMethod = env_->GetStaticMethodID(NativeLibClass, "swapBuffers", "()V");
}
env_->CallStaticVoidMethod(NativeLibClass, checkPauseMethod);
}
 
 
void gameButton(int state, int code)
{
switch (code)
259,22 → 231,22
 
void automapButton(int state,int code)
{
PortableAction(state,code);
PortableAction(state,code);
}
 
void inventoryButton(int state,int code)
{
PortableAction(state,code);
if (state == 0)
{
tcGameWeapons->setEnabled(true);
tcInventory->setEnabled(false);
}
PortableAction(state,code);
if (state == 0)
{
tcGameWeapons->setEnabled(true);
tcInventory->setEnabled(false);
}
}
 
void menuButton(int state,int code)
{
PortableKeyEvent(state, code,code);
PortableKeyEvent(state, code,code);
}
 
static int weaponWheelVisible = false;
281,7 → 253,7
 
void weaponWheelSelected(int enabled)
{
if (!enabled)
if (!enabled)
{
tcGameWeapons->fade(1, 5);
weaponWheelVisible = false;
299,7 → 271,7
 
void weaponWheelChosen(int segment)
{
LOGI("weaponWheel %d",segment);
LOGI("weaponWheel %d",segment);
 
if (segment == -1) //Nothing was selected
{
306,16 → 278,12
int32_t lw = PortableRead(READ_LASTWEAPON);
 
if (lw != -1)
{
PortableAction(1, gamefunc_Weapon_1 + lw);
PortableAction(0, gamefunc_Weapon_1 + lw);
}
PortableAction(2, gamefunc_Weapon_1 + lw);
 
return;
}
 
PortableAction(1, gamefunc_Weapon_1 + segment);
PortableAction(0, gamefunc_Weapon_1 + segment);
PortableAction(2, gamefunc_Weapon_1 + segment);
}
 
 
324,16 → 292,16
 
void left_double_tap(int state)
{
//LOGTOUCH("L double %d",state);
if (left_double_action)
PortableAction(state,left_double_action);
//LOGTOUCH("L double %d",state);
if (left_double_action)
PortableAction(state,left_double_action);
}
 
void right_double_tap(int state)
{
//LOGTOUCH("R double %d",state);
if (right_double_action)
PortableAction(state,right_double_action);
//LOGTOUCH("R double %d",state);
if (right_double_action)
PortableAction(state,right_double_action);
}
 
 
341,51 → 309,41
float strafe_sens,forward_sens;
float pitch_sens,yaw_sens;
 
void left_stick(float joy_x, float joy_y,float mouse_x, float mouse_y)
void mouseMove(int action, float x, float y, float dx, float dy)
{
joy_x *=10;
float strafe = joy_x*joy_x;
//float strafe = joy_x;
if (joy_x < 0)
strafe *= -1;
//LOGI(" mouse dx = %f",dx);
 
PortableMove(joy_y * 15 * forward_sens,-strafe * strafe_sens);
if (weaponWheelVisible)
return;
 
double scale = (shooting && precisionShoot) ? PRECISIONSHOOTFACTOR : 1.f;
 
PortableLook(dx * 2 * yaw_sens * scale,
-dy * pitch_sens * scale * invertLook ? -1 : 1);
}
 
void right_stick(float joy_x, float joy_y,float mouse_x, float mouse_y)
void left_stick(float joy_x, float joy_y, float mouse_x, float mouse_y)
{
//LOGI(" mouse x = %f",mouse_x);
int invert = invertLook?-1:1;
joy_x *=10;
float strafe = joy_x*joy_x;
//float strafe = joy_x;
if (joy_x < 0)
strafe *= -1;
 
float scale = (shooting && precisionShoot) ? 0.3f : 1.f;
 
PortableLookPitch(LOOK_MODE_MOUSE,-mouse_y * pitch_sens * invert * scale);
 
if (turnMouseMode)
PortableLookYaw(LOOK_MODE_MOUSE,mouse_x*2*yaw_sens * scale);
else
PortableLookYaw(LOOK_MODE_JOYSTICK,joy_x*6*yaw_sens * scale);
PortableMove(joy_y * 15 * forward_sens, -strafe * strafe_sens);
}
 
void mouseMove(int action,float x, float y,float dx, float dy)
void right_stick(float joy_x, float joy_y, float mouse_x, float mouse_y)
{
LOGI(" mouse dx = %f",dx);
//LOGI(" mouse x = %f",mouse_x);
 
if (weaponWheelVisible)
return;
 
int invert = invertLook? -1 : 1;
float scale = (shooting && precisionShoot) ? 0.2f : 1.f;
 
PortableLookPitch(LOOK_MODE_MOUSE, -dy * pitch_sens * invert * scale);
 
PortableLookYaw(LOOK_MODE_MOUSE, dx * 2 * yaw_sens * scale);
mouseMove(0, joy_x, joy_y, mouse_x, mouse_y);
}
 
void setHideSticks(bool v)
{
if (touchJoyLeft) touchJoyLeft->setHideGraphics(v);
if (touchJoyRight) touchJoyRight->setHideGraphics(v);
if (touchJoyLeft) touchJoyLeft->setHideGraphics(v);
if (touchJoyRight) touchJoyRight->setHideGraphics(v);
}
 
void touchSettingsButton(int state)
392,158 → 350,159
{
int32_t paused = PortableRead(READ_PAUSED);
 
//We wanna pause the game when doing settings
if (state && !paused || !state && paused)
{
PortableKeyEvent(1,SDL_SCANCODE_PAUSE,0);
PortableKeyEvent(0,SDL_SCANCODE_PAUSE,0);
}
//We wanna pause the game when doing settings
if (state && !paused || !state && paused)
{
PortableKeyEvent(2,SDL_SCANCODE_PAUSE,0);
}
}
 
void initControls(int width, int height,const char * graphics_path,const char *settings_file)
void initControls(int width, int height, const char * graphics_path, const char *settings_file)
{
touchcontrols::GLScaleWidth = (float)width;
touchcontrols::GLScaleHeight = (float)height;
touchcontrols::GLScaleWidth = (float)width;
touchcontrols::GLScaleHeight = (float)height;
 
LOGI("initControls %d x %d,x path = %s, settings = %s",width,height,graphics_path,settings_file);
LOGI("initControls %d x %d,x path = %s, settings = %s",width,height,graphics_path,settings_file);
 
if (!controlsCreated)
{
LOGI("creating controls");
if (!controlsCreated)
{
LOGI("creating controls");
 
touchcontrols::setGraphicsBasePath(graphics_path);
touchcontrols::setGraphicsBasePath(graphics_path);
 
controlsContainer.openGL_start.connect( sigc::ptr_fun(&openGLStart));
controlsContainer.openGL_end.connect( sigc::ptr_fun(&openGLEnd));
controlsContainer.signal_settings.connect( sigc::ptr_fun(&touchSettingsButton));
controlsContainer.openGL_start.connect( sigc::ptr_fun(&openGLStart));
controlsContainer.openGL_end.connect( sigc::ptr_fun(&openGLEnd));
controlsContainer.signal_settings.connect( sigc::ptr_fun(&touchSettingsButton));
 
 
tcMenuMain = new touchcontrols::TouchControls("menu",true,false);
tcGameMain = new touchcontrols::TouchControls("game",false,true,1,true);
tcGameWeapons = new touchcontrols::TouchControls("weapons",false,true,1,false);
tcAutomap = new touchcontrols::TouchControls("automap",false,true,1,false);
tcInventory = new touchcontrols::TouchControls("inventory",false,true,1,false);
tcGameLook = new touchcontrols::TouchControls("mouse",true,false);
controlsContainer.dukeHack = 1;
tcMenuMain = new touchcontrols::TouchControls("menu",true,false);
tcGameMain = new touchcontrols::TouchControls("game",false,true,1,true);
tcGameWeapons = new touchcontrols::TouchControls("weapons",false,true,1,false);
tcAutomap = new touchcontrols::TouchControls("automap",false,true,1,false);
tcInventory = new touchcontrols::TouchControls("inventory",false,true,1,false);
tcGameLook = new touchcontrols::TouchControls("mouse",true,false);
//controlsContainer.dukeHack = 1;
 
tcGameMain->signal_settingsButton.connect( sigc::ptr_fun(&gameSettingsButton) );
tcGameMain->signal_settingsButton.connect( sigc::ptr_fun(&gameSettingsButton) );
 
//Menu
tcMenuMain->addControl(new touchcontrols::Button("down_arrow",touchcontrols::RectF(20,13,23,16),"arrow_down",SDL_SCANCODE_DOWN,true)); //Repeating buttons
tcMenuMain->addControl(new touchcontrols::Button("up_arrow",touchcontrols::RectF(20,10,23,13),"arrow_up",SDL_SCANCODE_UP,true));
tcMenuMain->addControl(new touchcontrols::Button("left_arrow",touchcontrols::RectF(17,13,20,16),"arrow_left",SDL_SCANCODE_LEFT,true));
tcMenuMain->addControl(new touchcontrols::Button("right_arrow",touchcontrols::RectF(23,13,26,16),"arrow_right",SDL_SCANCODE_RIGHT,true));
tcMenuMain->addControl(new touchcontrols::Button("enter",touchcontrols::RectF(0,12,4,16),"enter",SDL_SCANCODE_RETURN));
tcMenuMain->addControl(new touchcontrols::Button("esc",touchcontrols::RectF(0,9,4,12),"esc",SDL_SCANCODE_ESCAPE));
//Menu
tcMenuMain->addControl(new touchcontrols::Button("down_arrow",touchcontrols::RectF(20,13,23,16),"arrow_down",SDL_SCANCODE_DOWN,true)); //Repeating buttons
tcMenuMain->addControl(new touchcontrols::Button("up_arrow",touchcontrols::RectF(20,10,23,13),"arrow_up",SDL_SCANCODE_UP,true));
tcMenuMain->addControl(new touchcontrols::Button("left_arrow",touchcontrols::RectF(17,13,20,16),"arrow_left",SDL_SCANCODE_LEFT,true));
tcMenuMain->addControl(new touchcontrols::Button("right_arrow",touchcontrols::RectF(23,13,26,16),"arrow_right",SDL_SCANCODE_RIGHT,true));
tcMenuMain->addControl(new touchcontrols::Button("enter",touchcontrols::RectF(0,12,3,15),"enter",SDL_SCANCODE_RETURN));
tcMenuMain->addControl(new touchcontrols::Button("esc",touchcontrols::RectF(0,8,3,11),"esc",SDL_SCANCODE_ESCAPE));
 
 
tcMenuMain->signal_button.connect( sigc::ptr_fun(&menuButton) );
tcMenuMain->setAlpha(0.5);
tcMenuMain->signal_button.connect( sigc::ptr_fun(&menuButton) );
tcMenuMain->setAlpha(0.5);
 
 
tcInventory->addControl(new touchcontrols::Button("jetpack", touchcontrols::RectF(4,3,7,6),"jetpack",gamefunc_Jetpack));
tcInventory->addControl(new touchcontrols::Button("medkit", touchcontrols::RectF(7,3,10,6),"medkit",gamefunc_MedKit));
tcInventory->addControl(new touchcontrols::Button("nightv", touchcontrols::RectF(4,6,7,9),"nightvision",gamefunc_NightVision));
tcInventory->addControl(new touchcontrols::Button("holoduke",touchcontrols::RectF(7,6,10,9),"holoduke",gamefunc_Holo_Duke));
tcInventory->addControl(new touchcontrols::Button("steroids",touchcontrols::RectF(4,9,7,12),"steroids",gamefunc_Steroids));
tcMenuMain->setAlpha(1);
tcInventory->addControl(new touchcontrols::Button("jetpack", touchcontrols::RectF(4,3,7,6),"jetpack",gamefunc_Jetpack));
tcInventory->addControl(new touchcontrols::Button("medkit", touchcontrols::RectF(7,3,10,6),"medkit",gamefunc_MedKit));
tcInventory->addControl(new touchcontrols::Button("nightv", touchcontrols::RectF(4,6,7,9),"nightvision",gamefunc_NightVision));
tcInventory->addControl(new touchcontrols::Button("holoduke",touchcontrols::RectF(7,6,10,9),"holoduke",gamefunc_Holo_Duke));
tcInventory->addControl(new touchcontrols::Button("steroids",touchcontrols::RectF(4,9,7,12),"steroids",gamefunc_Steroids));
tcMenuMain->setAlpha(1);
 
 
tcInventory->signal_button.connect( sigc::ptr_fun(&inventoryButton));
tcInventory->signal_button.connect( sigc::ptr_fun(&inventoryButton));
 
/*
//Automap
tcAutomap->addControl(new touchcontrols::Button("down_arrow",touchcontrols::RectF(2,14,4,16),"arrow_down",PORT_ACT_MAP_DOWN));
tcAutomap->addControl(new touchcontrols::Button("up_arrow",touchcontrols::RectF(2,10,4,12),"arrow_up",PORT_ACT_MAP_UP));
tcAutomap->addControl(new touchcontrols::Button("left_arrow",touchcontrols::RectF(0,12,2,14),"arrow_left",PORT_ACT_MAP_LEFT));
tcAutomap->addControl(new touchcontrols::Button("right_arrow",touchcontrols::RectF(4,12,6,14),"arrow_right",PORT_ACT_MAP_RIGHT));
tcAutomap->addControl(new touchcontrols::Button("zoom_in",touchcontrols::RectF(4,10,6,12),"zoom_in",PORT_ACT_MAP_ZOOM_IN));
tcAutomap->addControl(new touchcontrols::Button("zoom_out",touchcontrols::RectF(4,14,6,16),"zoom_out",PORT_ACT_MAP_ZOOM_OUT));
/*
//Automap
tcAutomap->addControl(new touchcontrols::Button("down_arrow",touchcontrols::RectF(2,14,4,16),"arrow_down",PORT_ACT_MAP_DOWN));
tcAutomap->addControl(new touchcontrols::Button("up_arrow",touchcontrols::RectF(2,10,4,12),"arrow_up",PORT_ACT_MAP_UP));
tcAutomap->addControl(new touchcontrols::Button("left_arrow",touchcontrols::RectF(0,12,2,14),"arrow_left",PORT_ACT_MAP_LEFT));
tcAutomap->addControl(new touchcontrols::Button("right_arrow",touchcontrols::RectF(4,12,6,14),"arrow_right",PORT_ACT_MAP_RIGHT));
tcAutomap->addControl(new touchcontrols::Button("zoom_in",touchcontrols::RectF(4,10,6,12),"zoom_in",PORT_ACT_MAP_ZOOM_IN));
tcAutomap->addControl(new touchcontrols::Button("zoom_out",touchcontrols::RectF(4,14,6,16),"zoom_out",PORT_ACT_MAP_ZOOM_OUT));
 
tcAutomap->signal_button.connect( sigc::ptr_fun(&automapButton) );
tcAutomap->setAlpha(0.5);
*/
tcAutomap->signal_button.connect( sigc::ptr_fun(&automapButton) );
tcAutomap->setAlpha(0.5);
*/
 
//Game
tcGameMain->setAlpha(gameControlsAlpha);
controlsContainer.editButtonAlpha = gameControlsAlpha;
tcGameMain->addControl(new touchcontrols::Button("use",touchcontrols::RectF(23,4,26,7),"use",gamefunc_Open));
tcGameMain->addControl(new touchcontrols::Button("attack",touchcontrols::RectF(20,7,23,10),"fire2",gamefunc_Fire));
tcGameMain->addControl(new touchcontrols::Button("jump",touchcontrols::RectF(23,7,26,10),"jump",gamefunc_Jump));
tcGameMain->addControl(new touchcontrols::Button("crouch",touchcontrols::RectF(24,14,26,16),"crouch",gamefunc_Crouch));
tcGameMain->addControl(new touchcontrols::Button("kick",touchcontrols::RectF(20,4,23,7),"boot",gamefunc_Quick_Kick));
//Game
tcGameMain->setAlpha(gameControlsAlpha);
controlsContainer.editButtonAlpha = gameControlsAlpha;
tcGameMain->addControl(new touchcontrols::Button("use",touchcontrols::RectF(23,4,26,7),"use",gamefunc_Open));
tcGameMain->addControl(new touchcontrols::Button("attack",touchcontrols::RectF(20,7,23,10),"fire2",gamefunc_Fire));
tcGameMain->addControl(new touchcontrols::Button("jump",touchcontrols::RectF(23,7,26,10),"jump",gamefunc_Jump));
tcGameMain->addControl(new touchcontrols::Button("crouch",touchcontrols::RectF(24,12,26,14),"crouch",gamefunc_Crouch));
tcGameMain->addControl(new touchcontrols::Button("kick",touchcontrols::RectF(20,4,23,7),"boot",gamefunc_Quick_Kick,false,true));
 
tcGameMain->addControl(new touchcontrols::Button("quick_save",touchcontrols::RectF(24,0,26,2),"save",KEY_QUICK_SAVE));
tcGameMain->addControl(new touchcontrols::Button("quick_load",touchcontrols::RectF(20,0,22,2),"load",KEY_QUICK_LOAD));
tcGameMain->addControl(new touchcontrols::Button("map",touchcontrols::RectF(4,0,6,2),"map",gamefunc_Map));
tcGameMain->addControl(new touchcontrols::Button("keyboard",touchcontrols::RectF(8,0,10,2),"keyboard",KEY_SHOW_KBRD));
tcGameMain->addControl(new touchcontrols::Button("quick_save",touchcontrols::RectF(24,0,26,2),"save",KEY_QUICK_SAVE));
tcGameMain->addControl(new touchcontrols::Button("quick_load",touchcontrols::RectF(20,0,22,2),"load",KEY_QUICK_LOAD));
tcGameMain->addControl(new touchcontrols::Button("map",touchcontrols::RectF(4,0,6,2),"map",gamefunc_Map,false,true));
tcGameMain->addControl(new touchcontrols::Button("keyboard",touchcontrols::RectF(8,0,10,2),"keyboard",KEY_SHOW_KBRD,false,true));
 
tcGameMain->addControl(new touchcontrols::Button("show_inventory",touchcontrols::RectF(0,0,2,3),"inv",KEY_SHOW_INVEN));
tcGameMain->addControl(new touchcontrols::Button("show_inventory",touchcontrols::RectF(2,0,4,2),"inv",KEY_SHOW_INVEN));
 
tcGameMain->addControl(new touchcontrols::Button("next_weapon",touchcontrols::RectF(0,3,3,5),"next_weap",gamefunc_Next_Weapon));
tcGameMain->addControl(new touchcontrols::Button("prev_weapon",touchcontrols::RectF(0,7,3,9),"prev_weap",gamefunc_Previous_Weapon));
//tcGameMain->addControl(new touchcontrols::Button("sniper",touchcontrols::RectF(0,5,3,7),"sniper",KEY_SNIPER));
tcGameMain->addControl(new touchcontrols::Button("next_weapon",touchcontrols::RectF(0,3,3,5),"next_weap",gamefunc_Next_Weapon));
tcGameMain->addControl(new touchcontrols::Button("prev_weapon",touchcontrols::RectF(0,7,3,9),"prev_weap",gamefunc_Previous_Weapon));
//tcGameMain->addControl(new touchcontrols::Button("sniper",touchcontrols::RectF(0,5,3,7),"sniper",KEY_SNIPER));
/*
//quick actions binds
tcGameMain->addControl(new touchcontrols::Button("quick_key_1",touchcontrols::RectF(4,3,6,5),"quick_key_1",KEY_QUICK_KEY1,false,true));
tcGameMain->addControl(new touchcontrols::Button("quick_key_2",touchcontrols::RectF(6,3,8,5),"quick_key_2",KEY_QUICK_KEY2,false,true));
tcGameMain->addControl(new touchcontrols::Button("quick_key_3",touchcontrols::RectF(8,3,10,5),"quick_key_3",KEY_QUICK_KEY3,false,true));
tcGameMain->addControl(new touchcontrols::Button("quick_key_4",touchcontrols::RectF(10,3,12,5),"quick_key_4",KEY_QUICK_KEY4,false,true));
*/
//Left stick
touchJoyLeft = new touchcontrols::TouchJoy("stick",touchcontrols::RectF(0,7,8,16),"strafe_arrow");
tcGameMain->addControl(touchJoyLeft);
touchJoyLeft->signal_move.connect(sigc::ptr_fun(&left_stick) );
touchJoyLeft->signal_double_tap.connect(sigc::ptr_fun(&left_double_tap) );
 
//quick actions binds
tcGameMain->addControl(new touchcontrols::Button("quick_key_1",touchcontrols::RectF(4,3,6,5),"quick_key_1",KEY_QUICK_KEY1,false,true));
tcGameMain->addControl(new touchcontrols::Button("quick_key_2",touchcontrols::RectF(6,3,8,5),"quick_key_2",KEY_QUICK_KEY2,false,true));
tcGameMain->addControl(new touchcontrols::Button("quick_key_3",touchcontrols::RectF(8,3,10,5),"quick_key_3",KEY_QUICK_KEY3,false,true));
tcGameMain->addControl(new touchcontrols::Button("quick_key_4",touchcontrols::RectF(10,3,12,5),"quick_key_4",KEY_QUICK_KEY4,false,true));
//Right stick
touchJoyRight = new touchcontrols::TouchJoy("touch",touchcontrols::RectF(17,7,26,16),"look_arrow");
tcGameMain->addControl(touchJoyRight);
touchJoyRight->signal_move.connect(sigc::ptr_fun(&right_stick) );
touchJoyRight->signal_double_tap.connect(sigc::ptr_fun(&right_double_tap) );
touchJoyRight->setEnabled(false);
 
//Left stick
touchJoyLeft = new touchcontrols::TouchJoy("stick",touchcontrols::RectF(0,7,8,16),"strafe_arrow");
tcGameMain->addControl(touchJoyLeft);
touchJoyLeft->signal_move.connect(sigc::ptr_fun(&left_stick) );
touchJoyLeft->signal_double_tap.connect(sigc::ptr_fun(&left_double_tap) );
tcGameMain->signal_button.connect( sigc::ptr_fun(&gameButton) );
 
//Right stick
touchJoyRight = new touchcontrols::TouchJoy("touch",touchcontrols::RectF(17,7,26,16),"look_arrow");
tcGameMain->addControl(touchJoyRight);
touchJoyRight->signal_move.connect(sigc::ptr_fun(&right_stick) );
touchJoyRight->signal_double_tap.connect(sigc::ptr_fun(&right_double_tap) );
touchJoyRight->setEnabled(false);
 
tcGameMain->signal_button.connect( sigc::ptr_fun(&gameButton) );
//Mouse look for whole screen
touchcontrols::Mouse *mouse = new touchcontrols::Mouse("mouse",touchcontrols::RectF(3,0,26,16),"");
mouse->signal_action.connect(sigc::ptr_fun(&mouseMove));
mouse->signal_double_tap.connect(sigc::ptr_fun(&right_double_tap) );
 
mouse->setHideGraphics(true);
tcGameMain->addControl(mouse);
//tcGameLook->addControl(mouse);
 
//Mouse look for whole screen
touchcontrols::Mouse *mouse = new touchcontrols::Mouse("mouse",touchcontrols::RectF(3,0,26,16),"");
mouse->signal_action.connect(sigc::ptr_fun(&mouseMove));
mouse->signal_double_tap.connect(sigc::ptr_fun(&right_double_tap) );
 
mouse->setHideGraphics(true);
tcGameLook->addControl(mouse);
 
//Weapons
weaponWheel = new touchcontrols::WheelSelect("weapon_wheel",touchcontrols::RectF(7,2,19,14),"weapon_wheel_orange_blank",10);
weaponWheel->signal_selected.connect(sigc::ptr_fun(&weaponWheelChosen) );
weaponWheel->signal_enabled.connect(sigc::ptr_fun(&weaponWheelSelected));
tcGameWeapons->addControl(weaponWheel);
 
 
//Weapons
weaponWheel = new touchcontrols::WheelSelect("weapon_wheel",touchcontrols::RectF(7,2,19,14),"weapon_wheel",10);
weaponWheel->signal_selected.connect(sigc::ptr_fun(&weaponWheelChosen) );
weaponWheel->signal_enabled.connect(sigc::ptr_fun(&weaponWheelSelected));
tcGameWeapons->addControl(weaponWheel);
tcGameWeapons->setAlpha(0.9);
 
controlsContainer.addControlGroup(tcMenuMain);
 
tcGameWeapons->setAlpha(0.9);
 
controlsContainer.addControlGroup(tcMenuMain);
controlsContainer.addControlGroup(tcGameMain);
controlsContainer.addControlGroup(tcInventory);//Need to be above tcGameMain incase buttons over stick
controlsContainer.addControlGroup(tcGameWeapons);
//controlsContainer.addControlGroup(tcAutomap);
//controlsContainer.addControlGroup(tcGameLook);
controlsCreated = 1;
 
controlsContainer.addControlGroup(tcInventory);//Need to be above tcGameMain incase buttons over stick
controlsContainer.addControlGroup(tcGameMain);
controlsContainer.addControlGroup(tcGameWeapons);
//controlsContainer.addControlGroup(tcAutomap);
controlsContainer.addControlGroup(tcGameLook);
controlsCreated = 1;
tcGameMain->setXMLFile((std::string)graphics_path + "/game.xml");
tcGameWeapons->setXMLFile((std::string)graphics_path + "/weapons.xml");
tcAutomap->setXMLFile((std::string)graphics_path + "/automap.xml");
tcInventory->setXMLFile((std::string)graphics_path + "/inventory.xml");
 
tcGameMain->setXMLFile((std::string)graphics_path + "/game.xml");
tcGameWeapons->setXMLFile((std::string)graphics_path + "/weapons.xml");
tcAutomap->setXMLFile((std::string)graphics_path + "/automap.xml");
tcInventory->setXMLFile((std::string)graphics_path + "/inventory.xml");
}
else
LOGI("NOT creating controls");
 
}
else
LOGI("NOT creating controls");
 
//controlsContainer.initGL();
//controlsContainer.initGL();
}
 
void frameControls()
552,112 → 511,107
static int inMenuLast = 1;
static int inAutomapLast = 0;
 
//LOGI("frameControls");
//We need to do this here now because duke loads a new gl context
if (!loadedGLImages)
{
touchJoyRight->setEnabled(false);
//LOGI("frameControls");
//We need to do this here now because duke loads a new gl context
if (!loadedGLImages)
{
touchJoyRight->setEnabled(false);
 
controlsContainer.initGL();
loadedGLImages = 1;
controlsContainer.initGL();
loadedGLImages = 1;
 
}
}
 
//LOGI("frameControls");
if (PortableRead(READ_RENDERER) == REND_CLASSIC)
curRenderer = REND_SOFT;
else
curRenderer = REND_GL;
//LOGI("frameControls");
curRenderer = (PortableRead(READ_RENDERER) != REND_CLASSIC);
 
int inMenuNew = PortableRead(READ_MENU);
if (inMenuLast != inMenuNew)
{
inMenuLast = inMenuNew;
if (!inMenuNew)
{
tcGameMain->setEnabled(true);
tcGameWeapons->setEnabled(true);
tcGameWeapons->fade(1,5);
tcMenuMain->setEnabled(false);
}
else
{
tcGameMain->setEnabled(false);
tcGameWeapons->setEnabled(false);
tcMenuMain->setEnabled(true);
}
}
int inMenuNew = PortableRead(READ_MENU);
if (inMenuLast != inMenuNew)
{
inMenuLast = inMenuNew;
if (!inMenuNew)
{
tcGameMain->setEnabled(true);
tcGameWeapons->setEnabled(true);
tcGameWeapons->fade(1,5);
tcMenuMain->setEnabled(false);
}
else
{
tcGameMain->setEnabled(false);
tcGameWeapons->setEnabled(false);
tcMenuMain->setEnabled(true);
}
}
 
int inAutomapNew = PortableRead(READ_AUTOMAP) && !inMenuLast; //Dont show if menu comes up
if (inAutomapLast != inAutomapNew)
{
inAutomapLast = inAutomapNew;
if (inAutomapNew)
{
tcAutomap->animateIn(5);
}
else
{
tcAutomap->animateOut(5);
}
}
int inAutomapNew = PortableRead(READ_AUTOMAP) && !inMenuLast; //Dont show if menu comes up
if (inAutomapLast != inAutomapNew)
{
inAutomapLast = inAutomapNew;
if (inAutomapNew)
{
tcAutomap->animateIn(5);
}
else
{
tcAutomap->animateOut(5);
}
}
 
setHideSticks(!showSticks);
controlsContainer.draw();
setHideSticks(!showSticks);
controlsContainer.draw();
}
 
void setTouchSettings(float alpha,float strafe,float fwd,float pitch,float yaw,int other)
{
gameControlsAlpha = 0.25 + (alpha * 0.75);
 
gameControlsAlpha = alpha;
if (tcGameMain)
{
tcGameMain->setAlpha(gameControlsAlpha);
controlsContainer.editButtonAlpha = gameControlsAlpha;
}
if (tcGameMain)
{
tcGameMain->setAlpha(gameControlsAlpha);
controlsContainer.editButtonAlpha = gameControlsAlpha;
tcGameWeapons->setAlpha(gameControlsAlpha);
tcInventory->setAlpha(gameControlsAlpha);
}
 
showWeaponCycle = other & 0x1?true:false;
turnMouseMode = other & 0x2?true:false;
invertLook = other & 0x4?true:false;
precisionShoot = other & 0x8?true:false;
showSticks = other & 0x1000?true:false;
toggleCrouch = other & 0x2?true:false;
invertLook = other & 0x4?true:false;
precisionShoot = other & 0x8?true:false;
showSticks = other & 0x1000?true:false;
 
hideTouchControls = other & 0x80000000?true:false;
hideTouchControls = other & 0x80000000?true:false;
 
 
switch ((other>>4) & 0xF)
{
case 1:
left_double_action = gamefunc_Fire;
break;
case 2:
left_double_action = gamefunc_Jump;
break;
default:
left_double_action = 0;
}
switch ((other>>4) & 0xF)
{
case 1:
left_double_action = gamefunc_Fire;
break;
case 2:
left_double_action = gamefunc_Jump;
break;
default:
left_double_action = 0;
}
 
switch ((other>>8) & 0xF)
{
case 1:
right_double_action = gamefunc_Fire;
break;
case 2:
right_double_action = gamefunc_Jump;
break;
default:
right_double_action = 0;
}
switch ((other>>8) & 0xF)
{
case 1:
right_double_action = gamefunc_Fire;
break;
case 2:
right_double_action = gamefunc_Jump;
break;
default:
right_double_action = 0;
}
 
strafe_sens = strafe;
forward_sens = fwd;
pitch_sens = pitch;
yaw_sens = yaw;
 
strafe_sens = strafe;
forward_sens = fwd;
pitch_sens = pitch;
yaw_sens = yaw;
}
 
int quit_now = 0;
 
#define EXPORT_ME __attribute__ ((visibility("default")))
 
JNIEnv* env_;
665,207 → 619,209
int argc=1;
const char * argv[32];
std::string graphicpath;
 
 
std::string doom_path;
 
const char * getDoomPath()
static const char * getGamePath()
{
return doom_path.c_str();
return doom_path.c_str();
}
 
jint EXPORT_ME
Java_com_beloko_duke_engine_NativeLib_init( JNIEnv* env,
jobject thiz,jstring graphics_dir,jint mem_mb,jobjectArray argsArray,jint renderer,jstring doom_path_ )
jobject thiz,jstring graphics_dir,jint audio_rate,jint audio_buffer_size,jobjectArray argsArray,jint renderer,jstring doom_path_ )
{
env_ = env;
curRenderer = renderer;
//curRenderer = REND_SOFT;
curRenderer = REND_GL;
env_ = env;
 
argv[0] = "eduke32";
int argCount = (env)->GetArrayLength( argsArray);
LOGI("argCount = %d",argCount);
for (int i=0; i<argCount; i++) {
jstring string = (jstring) (env)->GetObjectArrayElement( argsArray, i);
argv[argc] = (char *)(env)->GetStringUTFChars( string, 0);
LOGI("arg = %s",argv[argc]);
argc++;
}
android_sample_rate = audio_rate;
android_audio_buffer_size = audio_buffer_size;
 
curRenderer = renderer;
//curRenderer = REND_SOFT;
curRenderer = REND_GL;
 
argv[0] = "eduke32";
int argCount = (env)->GetArrayLength( argsArray);
LOGI("argCount = %d",argCount);
for (int i=0; i<argCount; i++) {
jstring string = (jstring) (env)->GetObjectArrayElement( argsArray, i);
argv[argc] = (char *)(env)->GetStringUTFChars( string, 0);
LOGI("arg = %s",argv[argc]);
argc++;
}
 
doom_path = (char *)(env)->GetStringUTFChars( doom_path_, 0);
 
//Change working dir, save games etc
 
chdir(getDoomPath());
putenv("TIMIDITY_CFG=../timidity.cfg");
doom_path = (char *)(env)->GetStringUTFChars( doom_path_, 0);
 
LOGI("doom_path = %s",getDoomPath());
//argv[0] = "vavoom";
//argv[1] = "-basedir";
//argv[2] = "/sdcard/Beloko/Quake/FULL";
//args[3] = "-doom";
//Change working dir, save games etc
// FIXME: potentially conflicts with chdirs in -game_dir support
chdir(getGamePath());
char timidity_env[512];
 
sprintf(timidity_env,"TIMIDITY_CFG=%s/../timidity.cfg",getGamePath());
//putenv("TIMIDITY_CFG=../timidity.cfg");
putenv(timidity_env);
 
const char * p = env->GetStringUTFChars(graphics_dir,NULL);
graphicpath = std::string(p);
LOGI("doom_path = %s",getGamePath());
//argv[0] = "vavoom";
//argv[1] = "-basedir";
//argv[2] = "/sdcard/Beloko/Quake/FULL";
//args[3] = "-doom";
 
 
const char * p = env->GetStringUTFChars(graphics_dir,NULL);
graphicpath = std::string(p);
 
initControls(android_screen_width,-android_screen_height,graphicpath.c_str(),(graphicpath + "/touch_controls.xml").c_str());
//initControls(2,-2,graphicpath.c_str(),(graphicpath + "/prdoom.xml").c_str());
 
/*
if (renderer != REND_SOFT)
SDL_SetSwapBufferCallBack(frameControls);
 
if (renderer == REND_SOFT)// In soft mode SDL calls swap buffer, disable so it does not flicker
SDL_SwapBufferPerformsSwap(false);
*/
initControls(android_screen_width,-android_screen_height,graphicpath.c_str(),(graphicpath + "/touch_controls.xml").c_str());
 
/*
if (renderer != REND_SOFT)
SDL_SetSwapBufferCallBack(frameControls);
 
SDL_SetSwapBufferCallBack(frameControls);
if (renderer == REND_SOFT)// In soft mode SDL calls swap buffer, disable so it does not flicker
SDL_SwapBufferPerformsSwap(false);
*/
 
//Now doen in java to keep context etc
//SDL_SwapBufferPerformsSwap(false);
 
SDL_SetSwapBufferCallBack(frameControls);
 
PortableInit(argc,argv);
//Now doen in java to keep context etc
//SDL_SwapBufferPerformsSwap(false);
 
 
return 0;
PortableInit(argc, argv);
 
 
return 0;
}
 
 
jint EXPORT_ME
Java_com_beloko_duke_engine_NativeLib_frame( JNIEnv* env,
jobject thiz )
jobject thiz )
{
 
LOGI("Java_com_beloko_duke_engine_NativeLib_frame");
LOGI("Java_com_beloko_duke_engine_NativeLib_frame");
 
PortableFrame();
frameControls();
 
frameControls();
 
return 0;
return 0;
}
 
__attribute__((visibility("default"))) jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
LOGI("JNI_OnLoad");
LOGI("JNI_OnLoad");
setTCJNIEnv(vm);
jvm_ = vm;
 
return JNI_VERSION_1_4;
return JNI_VERSION_1_4;
}
 
 
void EXPORT_ME
Java_com_beloko_duke_engine_NativeLib_keypress(JNIEnv *env, jobject obj,
jint down, jint keycode, jint unicode)
jint down, jint keycode, jint unicode)
{
LOGI("keypress %d",keycode);
if (controlsContainer.isEditing())
{
if (down && (keycode == SDL_SCANCODE_ESCAPE ))
controlsContainer.finishEditing();
 
}
else
PortableKeyEvent(down,keycode,unicode);
 
LOGI("keypress %d",keycode);
if (controlsContainer.isEditing())
{
if (down && (keycode == SDL_SCANCODE_ESCAPE ))
controlsContainer.finishEditing();
}
else
PortableKeyEvent(down,keycode,unicode);
}
 
 
void EXPORT_ME
Java_com_beloko_duke_engine_NativeLib_touchEvent(JNIEnv *env, jobject obj,
jint action, jint pid, jfloat x, jfloat y)
jint action, jint pid, jfloat x, jfloat y)
{
//LOGI("TOUCHED");
controlsContainer.processPointer(action,pid,x,y);
//LOGI("TOUCHED");
controlsContainer.processPointer(action,pid,x,y);
}
 
 
void EXPORT_ME Java_com_beloko_duke_engine_NativeLib_doAction(JNIEnv *env, jobject obj,
jint state, jint action)
jint state, jint action)
{
//gamepadButtonPressed();
if (hideTouchControls)
if (tcGameMain->isEnabled())
tcGameMain->animateOut(30);
LOGI("doAction %d %d",state,action);
PortableAction(state,action);
LOGI("doAction %d %d",state,action);
 
//gamepadButtonPressed();
if (hideTouchControls && tcGameMain)
{
if (tcGameMain->isEnabled())
tcGameMain->animateOut(30);
 
if (tcGameWeapons->isEnabled())
tcGameWeapons->animateOut(30);
}
 
PortableAction(state,action);
}
 
void EXPORT_ME Java_com_beloko_duke_engine_NativeLib_analogFwd(JNIEnv *env, jobject obj,
jfloat v)
jfloat v)
{
PortableMoveFwd(v);
PortableMove(v, 0.f);
}
 
void EXPORT_ME Java_com_beloko_duke_engine_NativeLib_analogSide(JNIEnv *env, jobject obj,
jfloat v)
jfloat v)
{
PortableMoveSide(v);
PortableMove(0.f, v);
}
 
void EXPORT_ME Java_com_beloko_duke_engine_NativeLib_analogPitch(JNIEnv *env, jobject obj,
jint mode,jfloat v)
jint mode,jfloat v)
{
PortableLookPitch(mode, v);
PortableLook(0.f, v);
}
 
void EXPORT_ME Java_com_beloko_duke_engine_NativeLib_analogYaw(JNIEnv *env, jobject obj,
jint mode,jfloat v)
jint mode,jfloat v)
{
PortableLookYaw(mode, v);
PortableLook(v, 0.f);
}
 
void EXPORT_ME Java_com_beloko_duke_engine_NativeLib_setTouchSettings(JNIEnv *env, jobject obj,
jfloat alpha,jfloat strafe,jfloat fwd,jfloat pitch,jfloat yaw,int other)
jfloat alpha,jfloat strafe,jfloat fwd,jfloat pitch,jfloat yaw,int other)
{
setTouchSettings(alpha,strafe,fwd,pitch,yaw,other);
setTouchSettings(alpha,strafe,fwd,pitch,yaw,other);
}
 
void EXPORT_ME Java_com_beloko_duke_engine_NativeLib_resetTouchSettings(JNIEnv *env, jobject obj)
{
controlsContainer.resetDefaults();
controlsContainer.resetDefaults();
}
 
std::string quickCommandString;
jint EXPORT_ME
Java_com_beloko_duke_engine_NativeLib_quickCommand(JNIEnv *env, jobject obj,
jstring command)
jstring command)
{
const char * p = env->GetStringUTFChars(command,NULL);
quickCommandString = std::string(p) + "\n";
env->ReleaseStringUTFChars(command, p);
PortableCommand(quickCommandString.c_str());
const char * p = env->GetStringUTFChars(command,NULL);
quickCommandString = std::string(p) + "\n";
env->ReleaseStringUTFChars(command, p);
PortableCommand(quickCommandString.c_str());
}
 
 
 
 
void EXPORT_ME
Java_com_beloko_duke_engine_NativeLib_setScreenSize( JNIEnv* env,
jobject thiz, jint width, jint height)
jobject thiz, jint width, jint height)
{
android_screen_width = width;
android_screen_height = height;
android_screen_width = width;
android_screen_height = height;
}
 
 
#include "SDL_main.h"
extern void SDL_Android_Init(JNIEnv* env, jclass cls);
 
void Java_org_libsdl_app_SDLActivity_nativeInit(JNIEnv* env, jclass cls)
void EXPORT_ME Java_org_libsdl_app_SDLActivity_nativeInit(JNIEnv* env, jclass cls)
{
/* This interface could expand with ABI negotiation, calbacks, etc. */
SDL_Android_Init(env, cls);
SDL_SetMainReady();
// SDL_EventState(SDL_TEXTINPUT,SDL_ENABLE);
/* This interface could expand with ABI negotiation, calbacks, etc. */
SDL_Android_Init(env, cls);
SDL_SetMainReady();
// SDL_EventState(SDL_TEXTINPUT,SDL_ENABLE);
}
 
 
}