diff --git a/polymer/eduke32/source/android/android-jni.cpp b/polymer/eduke32/source/android/android-jni.cpp index e195e3672..2dac95749 100644 --- a/polymer/eduke32/source/android/android-jni.cpp +++ b/polymer/eduke32/source/android/android-jni.cpp @@ -11,11 +11,15 @@ #include #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,7 +42,8 @@ static int curRenderer; 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 @@ -51,14 +56,13 @@ int android_screen_height; #define KEY_QUICK_KEY3 0x1013 #define KEY_QUICK_KEY4 0x1014 - 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::TouchJoy *touchJoyRight; 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); - } -} - - -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); + if (state == 1) + { + showTouchSettings(); + } } //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,29 +231,29 @@ void gameButton(int state, int code) 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; void weaponWheelSelected(int enabled) { - if (!enabled) + if (!enabled) { tcGameWeapons->fade(1, 5); weaponWheelVisible = false; @@ -299,23 +271,19 @@ void weaponWheelSelected(int enabled) void weaponWheelChosen(int segment) { - LOGI("weaponWheel %d",segment); + LOGI("weaponWheel %d",segment); if (segment == -1) //Nothing was selected { 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 @@ int right_double_action; 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,209 +309,200 @@ void right_double_tap(int state) 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) { 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) ); - - //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) ); + 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 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); + mouse->setHideGraphics(true); + tcGameMain->addControl(mouse); + //tcGameLook->addControl(mouse); - //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); + //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); - tcGameWeapons->setAlpha(0.9); + tcGameWeapons->setAlpha(0.9); - controlsContainer.addControlGroup(tcMenuMain); + controlsContainer.addControlGroup(tcMenuMain); - 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"); + 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; - } - else - LOGI("NOT creating controls"); + 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"); - //controlsContainer.initGL(); + } + else + LOGI("NOT creating controls"); + + //controlsContainer.initGL(); } void frameControls() @@ -552,112 +511,107 @@ void frameControls() 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; - } - - strafe_sens = strafe; - forward_sens = fwd; - pitch_sens = pitch; - yaw_sens = yaw; + 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; } -int quit_now = 0; - #define EXPORT_ME __attribute__ ((visibility("default"))) JNIEnv* env_; @@ -665,207 +619,209 @@ JNIEnv* env_; 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; iGetObjectArrayElement( 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; iGetObjectArrayElement( argsArray, i); + argv[argc] = (char *)(env)->GetStringUTFChars( string, 0); + LOGI("arg = %s",argv[argc]); + argc++; + } - doom_path = (char *)(env)->GetStringUTFChars( doom_path_, 0); + doom_path = (char *)(env)->GetStringUTFChars( doom_path_, 0); - //Change working dir, save games etc + //Change working dir, save games etc + // FIXME: potentially conflicts with chdirs in -game_dir support + chdir(getGamePath()); + char timidity_env[512]; - chdir(getDoomPath()); - putenv("TIMIDITY_CFG=../timidity.cfg"); + sprintf(timidity_env,"TIMIDITY_CFG=%s/../timidity.cfg",getGamePath()); + //putenv("TIMIDITY_CFG=../timidity.cfg"); + putenv(timidity_env); - LOGI("doom_path = %s",getDoomPath()); - //argv[0] = "vavoom"; - //argv[1] = "-basedir"; - //argv[2] = "/sdcard/Beloko/Quake/FULL"; - //args[3] = "-doom"; + 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); + 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()); + initControls(android_screen_width,-android_screen_height,graphicpath.c_str(),(graphicpath + "/touch_controls.xml").c_str()); - /* - if (renderer != REND_SOFT) - SDL_SetSwapBufferCallBack(frameControls); + /* + 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); - */ + if (renderer == REND_SOFT)// In soft mode SDL calls swap buffer, disable so it does not flicker + SDL_SwapBufferPerformsSwap(false); + */ - SDL_SetSwapBufferCallBack(frameControls); + SDL_SetSwapBufferCallBack(frameControls); - //Now doen in java to keep context etc - //SDL_SwapBufferPerformsSwap(false); + //Now doen in java to keep context etc + //SDL_SwapBufferPerformsSwap(false); - PortableInit(argc,argv); + PortableInit(argc, argv); - return 0; + 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); } - } diff --git a/polymer/eduke32/source/android/in_android.c b/polymer/eduke32/source/android/in_android.c index 211a055f0..092738ad4 100644 --- a/polymer/eduke32/source/android/in_android.c +++ b/polymer/eduke32/source/android/in_android.c @@ -21,148 +21,145 @@ extern int32_t main(int32_t argc, char *argv []); -#define BUTTONSET(x,value) (CONTROL_ButtonState |= ((uint64_t)value<<((uint64_t)(x)))) -#define BUTTONCLEAR(x) (CONTROL_ButtonState &= ~((uint64_t)1<<((uint64_t)(x)))) - extern int SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode); extern int SDL_SendKeyboardText(const char *text); -static float forwardmove, sidemove; //Joystick mode static char sdl_text[2]; +static droidinput_t droidinput; + int PortableKeyEvent(int state, int code,int unicode) { - LOGI("PortableKeyEvent %d %d %d",state,code,unicode); + LOGI("PortableKeyEvent %d %d %d",state,code,unicode); SDL_SendKeyboardKey(state ? SDL_PRESSED : SDL_RELEASED, code); - SDL_EventState(SDL_TEXTINPUT, SDL_ENABLE); + SDL_EventState(SDL_TEXTINPUT, SDL_ENABLE); - if (code == 42) - unicode = 42; + if (code == 42) + unicode = 42; - if (state) - { - //if (unicode < 128) - { - sdl_text[0] = unicode; - sdl_text[1] = 0; + if (state) + { + //if (unicode < 128) + { + sdl_text[0] = unicode; + sdl_text[1] = 0; - int posted = SDL_SendKeyboardText((const char*)sdl_text); - LOGI("posted = %d",posted); - } - } + int posted = SDL_SendKeyboardText((const char*)sdl_text); + LOGI("posted = %d",posted); + } - return 0; + if (state == 2) + PortableKeyEvent(0, code, unicode); + } + + return 0; } - - void changeActionState(int state, int action) { - if (state) - { - //BUTTONSET(action,1); - droidplayer.functionSticky |= ((uint64_t)1<<((uint64_t)(action))); - droidplayer.functionHeld |= ((uint64_t)1<<((uint64_t)(action))); + if (state) + { + //BUTTONSET(action,1); + droidinput.functionSticky |= ((uint64_t)1<<((uint64_t)(action))); + droidinput.functionHeld |= ((uint64_t)1<<((uint64_t)(action))); return; } //BUTTONCLEAR(action); - droidplayer.functionHeld &= ~((uint64_t) 1<<((uint64_t) (action))); + droidinput.functionHeld &= ~((uint64_t) 1<<((uint64_t) (action))); } void PortableAction(int state, int action) { - LOGI("PortableAction action = %d, state = %d",action,state); + LOGI("PortableAction action = %d, state = %d", action, state); - //Special toggle for crouch, NOT when using jetpack or in water - if (!g_player[myconnectindex].ps->jetpack_on && - g_player[myconnectindex].ps->on_ground && - (sector[g_player[myconnectindex].ps->cursectnum].lotag != ST_2_UNDERWATER)) - { - - if (action == gamefunc_Crouch) - { - if (state) - droidplayer.crouchToggleState = !droidplayer.crouchToggleState; - - state = droidplayer.crouchToggleState; - } - } - - //Check if jumping while crouched - if (action == gamefunc_Jump) + //Action is for the menu + if (action >= MENU_UP) { - droidplayer.crouchToggleState = 0; - changeActionState(0, gamefunc_Crouch); + if (PortableRead(READ_MENU)) + { + int sdl_code = 0; + switch (action) + { + case MENU_UP: + sdl_code = SDL_SCANCODE_UP; + break; + case MENU_DOWN: + sdl_code = SDL_SCANCODE_DOWN; + break; + case MENU_LEFT: + sdl_code = SDL_SCANCODE_LEFT; + break; + case MENU_RIGHT: + sdl_code = SDL_SCANCODE_RIGHT; + break; + case MENU_SELECT: + sdl_code = SDL_SCANCODE_RETURN; + break; + case MENU_BACK: + sdl_code = SDL_SCANCODE_ESCAPE; + break; + } + + PortableKeyEvent(state, sdl_code, 0); + + return; + } } + else + { + if (PortableRead(READ_MENU)) //If in the menu, dont do any game actions + return; - changeActionState(state,action); - LOGI("PortableAction state = 0x%016llX",CONTROL_ButtonState); + //Special toggle for crouch, NOT when using jetpack or in water + if (!g_player[myconnectindex].ps->jetpack_on && + g_player[myconnectindex].ps->on_ground && + (sector[g_player[myconnectindex].ps->cursectnum].lotag != ST_2_UNDERWATER)) + { + if (toggleCrouch) + { + if (action == gamefunc_Crouch) + { + if (state) + droidinput.crouchToggleState = !droidinput.crouchToggleState; + + state = droidinput.crouchToggleState; + } + } + } + + //Check if jumping while crouched + if (action == gamefunc_Jump) + { + crouchToggleState = 0; + changeActionState(0, gamefunc_Crouch); + } + + changeActionState(state, action); + + LOGI("PortableAction state = 0x%016llX", CONTROL_ButtonState); + } } - // =================== FORWARD and SIDE MOVMENT ============== -void PortableMoveFwd(float fwd) -{ - forwardmove = fclamp2(fwd, -1.f, 1.f); -} - -void PortableMoveSide(float strafe) -{ - sidemove = fclamp2(strafe, -1.f, 1.f); -} - void PortableMove(float fwd, float strafe) { - PortableMoveFwd(fwd); - PortableMoveSide(strafe); + droidinput.forwardmove = fclamp2(fwd + droidinput.forwardmove, -1.f, 1.f); + droidinput.sidemove = fclamp2(strafe + droidinput.sidemove, -1.f, 1.f); } //====================================================================== -//Look up and down -int look_pitch_mode; -float look_pitch_mouse,look_pitch_abs,look_pitch_joy; -void PortableLookPitch(int mode, float pitch) +void PortableLook(double yaw, double pitch) { - //LOGI("PortableLookPitch %d %f",mode, pitch); - look_pitch_mode = mode; - switch(mode) - { - case LOOK_MODE_MOUSE: - look_pitch_mouse += pitch; - break; - case LOOK_MODE_ABSOLUTE: - look_pitch_abs = pitch; - break; - case LOOK_MODE_JOYSTICK: - look_pitch_joy = pitch; - break; - } + //LOGI("PortableLookPitch %d %f",mode, pitch); + droidinput.pitch += pitch; + droidinput.yaw += yaw; } -//left right -int look_yaw_mode; -float look_yaw_mouse,look_yaw_joy; -void PortableLookYaw(int mode, float yaw) -{ - look_yaw_mode = mode; - switch(mode) - { - case LOOK_MODE_MOUSE: - look_yaw_mouse += yaw; - break; - case LOOK_MODE_JOYSTICK: - look_yaw_joy = yaw; - break; - } -} - - - void PortableCommand(const char * cmd) { OSD_Dispatch(cmd); @@ -170,13 +167,7 @@ void PortableCommand(const char * cmd) void PortableInit(int argc,const char ** argv) { - main(argc, argv); -} - - -void PortableFrame() -{ - //NOT USED for DUKE + main(argc, argv); } int32_t PortableRead(portableread_t r) @@ -194,7 +185,7 @@ int32_t PortableRead(portableread_t r) case READ_RENDERER: return getrendermode(); case READ_LASTWEAPON: - return droidplayer.lastWeapon; + return droidinput.lastWeapon; case READ_PAUSED: return ud.pause_on != 0; default: @@ -206,54 +197,35 @@ int32_t PortableRead(portableread_t r) void CONTROL_Android_SetLastWeapon(int w) { - LOGI("setLastWeapon %d",w); - droidplayer.lastWeapon = w; + LOGI("setLastWeapon %d",w); + droidinput.lastWeapon = w; } void CONTROL_Android_ClearButton(int32_t whichbutton) { - BUTTONCLEAR(whichbutton); - droidplayer.functionHeld &= ~((uint64_t)1<<((uint64_t)(whichbutton))); + BUTTONCLEAR(whichbutton); + droidinput.functionHeld &= ~((uint64_t)1<<((uint64_t)(whichbutton))); } void CONTROL_Android_PollDevices(ControlInfo *info) { - //LOGI("CONTROL_Android_PollDevices %f %f",forwardmove,sidemove); + //LOGI("CONTROL_Android_PollDevices %f %f",forwardmove,sidemove); - info->dz = -forwardmove * 5000; - info->dx = sidemove * 200; + info->dz = -droidinput.forwardmove * 5000; + info->dx = droidinput.sidemove * 200; + info->dpitch = droidinput.pitch * 100000; + info->dyaw = -droidinput.yaw * 80000; - switch(look_pitch_mode) - { - case LOOK_MODE_MOUSE: - info->dpitch = look_pitch_mouse * 100000; - look_pitch_mouse = 0; - break; - case LOOK_MODE_ABSOLUTE: - //cl.viewangles[0] = look_pitch_abs * 80; - break; - case LOOK_MODE_JOYSTICK: - info->dpitch = look_pitch_joy * 2000; - break; - } + droidinput.forwardmove = droidinput.sidemove = 0.f; + droidinput.pitch = droidinput.yaw = 0.f; - switch(look_yaw_mode) - { - case LOOK_MODE_MOUSE: - info->dyaw = -look_yaw_mouse * 80000; - look_yaw_mouse = 0; - break; - case LOOK_MODE_JOYSTICK: - info->dyaw = -look_yaw_joy * 4000; - break; - } - CONTROL_ButtonState = 0; - CONTROL_ButtonState |= droidplayer.functionSticky; - CONTROL_ButtonState |= droidplayer.functionHeld; + CONTROL_ButtonState = 0; + CONTROL_ButtonState |= droidinput.functionSticky; + CONTROL_ButtonState |= droidinput.functionHeld; - droidplayer.functionSticky = 0; + droidinput.functionSticky = 0; - //LOGI("poll state = 0x%016llX",CONTROL_ButtonState); + //LOGI("poll state = 0x%016llX",CONTROL_ButtonState); } diff --git a/polymer/eduke32/source/android/in_android.h b/polymer/eduke32/source/android/in_android.h index d18b11eef..6530b7130 100644 --- a/polymer/eduke32/source/android/in_android.h +++ b/polymer/eduke32/source/android/in_android.h @@ -1,51 +1,55 @@ #include "function.h" #include "compat.h" -enum { - LOOK_MODE_MOUSE = 0, - LOOK_MODE_ABSOLUTE, - LOOK_MODE_JOYSTICK -}; - #ifdef __cplusplus extern "C" { #endif - typedef enum { - READ_MENU, - READ_WEAPONS, - READ_AUTOMAP, - READ_KEYBOARD, - READ_RENDERER, - READ_LASTWEAPON, - READ_PAUSED - } portableread_t; +#define MENU_UP 0x200 +#define MENU_DOWN 0x201 +#define MENU_LEFT 0x202 +#define MENU_RIGHT 0x203 +#define MENU_SELECT 0x204 +#define MENU_BACK 0x205 - int32_t PortableRead(portableread_t r); +#define BUTTONSET(x,value) (CONTROL_ButtonState |= ((uint64_t)value<<((uint64_t)(x)))) +#define BUTTONCLEAR(x) (CONTROL_ButtonState &= ~((uint64_t)1<<((uint64_t)(x)))) - typedef struct - { - int32_t crouchToggleState; - int32_t lastWeapon; - uint64_t functionSticky; //To let at least one tick - uint64_t functionHeld; - } androidplayer_t; +#define PRECISIONSHOOTFACTOR 0.3f - extern androidplayer_t droidplayer; +typedef enum { + READ_MENU, + READ_WEAPONS, + READ_AUTOMAP, + READ_KEYBOARD, + READ_RENDERER, + READ_LASTWEAPON, + READ_PAUSED +} portableread_t; - int PortableKeyEvent(int state, int code, int unicode); - void PortableAction(int state, int action); +typedef struct +{ + int32_t crouchToggleState; + int32_t lastWeapon; - void PortableMove(float fwd, float strafe); - void PortableMoveFwd(float fwd); - void PortableMoveSide(float strafe); - void PortableLookPitch(int mode, float pitch); - void PortableLookYaw(int mode, float pitch); - void PortableCommand(const char * cmd); + uint64_t functionSticky; //To let at least one tick + uint64_t functionHeld; - void PortableInit(int argc, const char ** argv); - void PortableFrame(); + double pitch, yaw; + float forwardmove, sidemove; +} droidinput_t; + +int PortableKeyEvent(int state, int code, int unicode); +int PortableRead(portableread_t r); + +void PortableAction(int state, int action); + +void PortableMove(float fwd, float strafe); +void PortableLook(double yaw, double pitch); +void PortableCommand(const char * cmd); + +void PortableInit(int argc, const char ** argv); #ifdef __cplusplus }