From b782af29491809956e35cf1a64f45fcb0d6cedcc Mon Sep 17 00:00:00 2001 From: Ethan Uzarowski Date: Fri, 23 Feb 2018 20:43:46 -0500 Subject: [PATCH 01/17] Remove "Final lap!" message in one-lap races (#3127) * Fix "Final lap!" message on one-lap races When starting a one-lap race, the game gives the message "Final lap!". This should only be given when there is more than one lap in the race. This commit changes linear_world.cpp so that this message is only given when the number of laps in the race is greater than 1. * Fix spacing I accidentally changed the spacing when making my last commit. This commit fixes that accident. --- src/modes/linear_world.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/modes/linear_world.cpp b/src/modes/linear_world.cpp index 388df6a75..678a07acd 100644 --- a/src/modes/linear_world.cpp +++ b/src/modes/linear_world.cpp @@ -284,8 +284,11 @@ void LinearWorld::newLap(unsigned int kart_index) // Last lap message (kart_index's assert in previous block already) if (raceHasLaps() && kart_info.m_race_lap+1 == lap_count) { - m_race_gui->addMessage(_("Final lap!"), kart, + if (lap_count > 1) + { + m_race_gui->addMessage(_("Final lap!"), kart, 3.0f, GUIEngine::getSkin()->getColor("font::normal"), true); + } if(!m_last_lap_sfx_played && lap_count > 1) { if (UserConfigParams::m_music) From 34f0f8c2395a7a23b8812e73403f54ae5137b597 Mon Sep 17 00:00:00 2001 From: Deve Date: Sun, 25 Feb 2018 22:17:53 +0100 Subject: [PATCH 02/17] Fixed a bug with red light in thunderbird model on android --- android/generate_assets.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android/generate_assets.sh b/android/generate_assets.sh index e759724d7..5225867e6 100755 --- a/android/generate_assets.sh +++ b/android/generate_assets.sh @@ -43,7 +43,8 @@ export RUN_OPTIMIZE_SCRIPT=0 export DECREASE_QUALITY=1 export CONVERT_TO_JPG=1 -export CONVERT_TO_JPG_BLACKLIST="data/karts/hexley/hexley_kart_diffuse.png" +export CONVERT_TO_JPG_BLACKLIST="data/karts/hexley/hexley_kart_diffuse.png \ + data/models/traffic_light.png" export BLACKLIST_FILES="data/music/cocoa_river_fast.ogg2" From 78bb9e78ac7f1b502bb01c4eea48d14f34d0d938 Mon Sep 17 00:00:00 2001 From: Deve Date: Sun, 25 Feb 2018 22:40:15 +0100 Subject: [PATCH 03/17] Fixed version number for nvidia gles. It uses gl version string: OpenGL ES 3.2 NVIDIA 384.111 --- src/graphics/graphics_restrictions.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/graphics/graphics_restrictions.cpp b/src/graphics/graphics_restrictions.cpp index 78c9caf4c..f7c1d50d8 100644 --- a/src/graphics/graphics_restrictions.cpp +++ b/src/graphics/graphics_restrictions.cpp @@ -200,6 +200,11 @@ public: convertVersionString(s[2]); return; } + else if (s.size() == 5) + { + convertVersionString(s[4]); + return; + } } From 4cc56aec1b793e7a0bf2fe2cb956b4e7596f6bea Mon Sep 17 00:00:00 2001 From: Deve Date: Mon, 26 Feb 2018 21:25:08 +0100 Subject: [PATCH 04/17] Detect system language on android --- src/utils/translation.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/utils/translation.cpp b/src/utils/translation.cpp index 39f7ca96a..ec4d43e71 100644 --- a/src/utils/translation.cpp +++ b/src/utils/translation.cpp @@ -45,6 +45,10 @@ #include "utils/constants.hpp" #include "utils/log.hpp" +#ifdef ANDROID +#include "main_android.hpp" +#endif + // set to 1 to debug i18n #define TRANSLATE_VERBOSE 0 @@ -301,6 +305,24 @@ Translations::Translations() //: m_dictionary_manager("UTF-16") "GetLocaleInfo tryname returns '%s'.", c); if(c[0]) language += std::string("_")+c; } // if c[0] + +#elif defined(ANDROID) + char p_language[3] = {}; + AConfiguration_getLanguage(global_android_app->config, p_language); + + if (p_language != NULL) + { + language += p_language; + + char p_country[3] = {}; + AConfiguration_getCountry(global_android_app->config, p_country); + + if (p_country) + { + language += "_"; + language += p_country; + } + } #endif } // neither LANGUAGE nor LANG defined From 39c50c838ffdc21fe5f28b00e29a02b608d55af5 Mon Sep 17 00:00:00 2001 From: samuncle Date: Tue, 27 Feb 2018 23:20:49 +0100 Subject: [PATCH 05/17] Make access to the time of the track in the shader to react to day/night cycle --- src/graphics/sp/sp_shader_manager.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/graphics/sp/sp_shader_manager.cpp b/src/graphics/sp/sp_shader_manager.cpp index e4b491583..b484ee766 100644 --- a/src/graphics/sp/sp_shader_manager.cpp +++ b/src/graphics/sp/sp_shader_manager.cpp @@ -60,6 +60,13 @@ SPShaderManager::SPShaderManager() ua->setValue(sp_wind_dir); } }, + { "isDuringDayUniformAssigner", [](SPUniformAssigner* ua) + { + int is_during_day = Track::getCurrentTrack() ? + Track::getCurrentTrack()->getIsDuringDay() ? 1 : 0 : 0; + ua->setValue(is_during_day); + } + }, { "zeroAlphaUniformAssigner", [](SPUniformAssigner* ua) { ua->setValue(0.0f); From 36c6ea52aecb88c506e21fb633f768c91e268e24 Mon Sep 17 00:00:00 2001 From: Deve Date: Tue, 27 Feb 2018 23:22:03 +0100 Subject: [PATCH 06/17] Allow to detect device rotation for better accelerometer support --- .../source/Irrlicht/CIrrDeviceAndroid.cpp | 86 +++++++++++++++++++ .../source/Irrlicht/CIrrDeviceAndroid.h | 2 + 2 files changed, 88 insertions(+) diff --git a/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.cpp b/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.cpp index e8277aec4..296c4eaad 100644 --- a/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.cpp +++ b/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.cpp @@ -156,6 +156,22 @@ void CIrrDeviceAndroid::printConfig() os::Printer::log(" touch:", core::stringc(touch).c_str(), ELL_DEBUG); os::Printer::log(" ui_mode_type:", core::stringc(ui_mode_type).c_str(), ELL_DEBUG); os::Printer::log(" ui_mode_night:", core::stringc(ui_mode_night).c_str(), ELL_DEBUG); + + int rotation = getRotation(); + int deg[4] = {0, 90, 180, 270}; + + os::Printer::log("Rotation: ", core::stringc(deg[rotation]).c_str(), ELL_DEBUG); + + int default_rotation = getDefaultRotation(); + + if (default_rotation == 1) + { + os::Printer::log("Default rotation: landscape", ELL_DEBUG); + } + else + { + os::Printer::log("Default rotation: portrait", ELL_DEBUG); + } } void CIrrDeviceAndroid::createVideoModeList() @@ -417,6 +433,7 @@ void CIrrDeviceAndroid::handleAndroidCommand(android_app* app, int32_t cmd) os::Printer::log("Android command APP_CMD_LOW_MEMORY", ELL_DEBUG); break; default: + os::Printer::log("Android command: ", core::stringc(cmd).c_str(), ELL_DEBUG); break; } @@ -1111,6 +1128,75 @@ void CIrrDeviceAndroid::getKeyChar(SEvent& event) } } +int CIrrDeviceAndroid::getRotation() +{ + JavaVMAttachArgs args; + args.version = JNI_VERSION_1_6; + args.name = "NativeThread"; + args.group = NULL; + JNIEnv* env; + + if (Android->activity->vm->AttachCurrentThread(&env, &args) != JNI_OK) + { + os::Printer::log("Cannot find rotation.", ELL_DEBUG); + return 0; + } + + jobject activity_obj = Android->activity->clazz; + + jclass activity = env->GetObjectClass(activity_obj); + jclass context = env->FindClass("android/content/Context"); + jclass window_manager = env->FindClass("android/view/WindowManager"); + jclass display = env->FindClass("android/view/Display"); + + jmethodID get_system_service = env->GetMethodID(activity, "getSystemService", + "(Ljava/lang/String;)Ljava/lang/Object;"); + jmethodID get_default_display = env->GetMethodID(window_manager, + "getDefaultDisplay", + "()Landroid/view/Display;"); + jmethodID get_rotation = env->GetMethodID(display, "getRotation", "()I"); + + jfieldID window_service = env->GetStaticFieldID(context, "WINDOW_SERVICE", + "Ljava/lang/String;"); + + jobject window_service_obj = env->GetStaticObjectField(context, window_service); + + jobject window_manager_obj = env->CallObjectMethod(activity_obj, get_system_service, + window_service_obj); + + jobject display_obj = env->CallObjectMethod(window_manager_obj, get_default_display); + + int rotation = env->CallIntMethod(display_obj, get_rotation); + + env->DeleteLocalRef(activity); + env->DeleteLocalRef(context); + env->DeleteLocalRef(window_manager); + env->DeleteLocalRef(display); + + Android->activity->vm->DetachCurrentThread(); + + return rotation; +} + +int CIrrDeviceAndroid::getDefaultRotation() +{ + int rotation = getRotation(); + + int32_t orientation = AConfiguration_getOrientation(Android->config); + + if (((rotation == 0 || rotation == 2) && + orientation == ACONFIGURATION_ORIENTATION_LAND) || + ((rotation == 1 || rotation == 3) && + orientation == ACONFIGURATION_ORIENTATION_PORT)) + { + return 1; + } + else + { + return 0; + } +} + bool CIrrDeviceAndroid::activateAccelerometer(float updateInterval) { if (!isAccelerometerAvailable()) diff --git a/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.h b/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.h index 62f87c042..d0c869769 100644 --- a/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.h +++ b/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.h @@ -133,6 +133,8 @@ namespace irr void createKeyMap(); void createVideoModeList(); void getKeyChar(SEvent& event); + int getRotation(); + int getDefaultRotation(); video::SExposedVideoData& getExposedVideoData(); static void handleAndroidCommand(android_app* app, int32_t cmd); From 6b4fb50876d4297a48a8bd87b133d174c372be0f Mon Sep 17 00:00:00 2001 From: Deve Date: Tue, 27 Feb 2018 23:24:00 +0100 Subject: [PATCH 07/17] Convert tabs to spaces --- .../source/Irrlicht/CIrrDeviceAndroid.cpp | 2014 ++++++++--------- .../source/Irrlicht/CIrrDeviceAndroid.h | 224 +- 2 files changed, 1119 insertions(+), 1119 deletions(-) diff --git a/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.cpp b/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.cpp index 296c4eaad..81b7f041c 100644 --- a/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.cpp +++ b/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.cpp @@ -16,11 +16,11 @@ namespace irr { - namespace video - { - IVideoDriver* createOGLES2Driver(const SIrrlichtCreationParameters& params, - video::SExposedVideoData& data, io::IFileSystem* io); - } + namespace video + { + IVideoDriver* createOGLES2Driver(const SIrrlichtCreationParameters& params, + video::SExposedVideoData& data, io::IFileSystem* io); + } } namespace irr @@ -38,265 +38,265 @@ bool CIrrDeviceAndroid::IsStarted = false; // have their default values on startup. void CIrrDeviceAndroid::onCreate() { - IsPaused = true; - IsFocused = false; - IsStarted = false; + IsPaused = true; + IsFocused = false; + IsStarted = false; } //! constructor CIrrDeviceAndroid::CIrrDeviceAndroid(const SIrrlichtCreationParameters& param) - : CIrrDeviceStub(param), - Accelerometer(0), - Gyroscope(0), - IsMousePressed(false), - GamepadAxisX(0), - GamepadAxisY(0) + : CIrrDeviceStub(param), + Accelerometer(0), + Gyroscope(0), + IsMousePressed(false), + GamepadAxisX(0), + GamepadAxisY(0) { - #ifdef _DEBUG - setDebugName("CIrrDeviceAndroid"); - #endif + #ifdef _DEBUG + setDebugName("CIrrDeviceAndroid"); + #endif - Android = (android_app *)(param.PrivateData); - assert(Android != NULL); + Android = (android_app *)(param.PrivateData); + assert(Android != NULL); - Android->userData = this; - Android->onAppCmd = handleAndroidCommand; - Android->onInputEvent = handleInput; - - printConfig(); - createKeyMap(); + Android->userData = this; + Android->onAppCmd = handleAndroidCommand; + Android->onInputEvent = handleInput; + + printConfig(); + createKeyMap(); - CursorControl = new CCursorControl(); - - Close = Android->destroyRequested; + CursorControl = new CCursorControl(); + + Close = Android->destroyRequested; - // It typically shouldn't happen, but just in case... - if (Close) - return; + // It typically shouldn't happen, but just in case... + if (Close) + return; - SensorManager = ASensorManager_getInstance(); - SensorEventQueue = ASensorManager_createEventQueue(SensorManager, - Android->looper, LOOPER_ID_USER, NULL, NULL); + SensorManager = ASensorManager_getInstance(); + SensorEventQueue = ASensorManager_createEventQueue(SensorManager, + Android->looper, LOOPER_ID_USER, NULL, NULL); - ANativeActivity_setWindowFlags(Android->activity, - AWINDOW_FLAG_KEEP_SCREEN_ON | - AWINDOW_FLAG_FULLSCREEN, 0); + ANativeActivity_setWindowFlags(Android->activity, + AWINDOW_FLAG_KEEP_SCREEN_ON | + AWINDOW_FLAG_FULLSCREEN, 0); - os::Printer::log("Waiting for Android activity window to be created.", ELL_DEBUG); + os::Printer::log("Waiting for Android activity window to be created.", ELL_DEBUG); - while (!IsStarted || !IsFocused || IsPaused) - { - s32 events = 0; - android_poll_source* source = 0; + while (!IsStarted || !IsFocused || IsPaused) + { + s32 events = 0; + android_poll_source* source = 0; - s32 id = ALooper_pollAll(-1, NULL, &events, (void**)&source); + s32 id = ALooper_pollAll(-1, NULL, &events, (void**)&source); - if (id >=0 && source != NULL) - { - source->process(Android, source); - } - } - - assert(Android->window); - os::Printer::log("Done", ELL_DEBUG); - - ExposedVideoData.OGLESAndroid.Window = Android->window; + if (id >=0 && source != NULL) + { + source->process(Android, source); + } + } + + assert(Android->window); + os::Printer::log("Done", ELL_DEBUG); + + ExposedVideoData.OGLESAndroid.Window = Android->window; - createVideoModeList(); + createVideoModeList(); - createDriver(); + createDriver(); - if (VideoDriver) - createGUIAndScene(); + if (VideoDriver) + createGUIAndScene(); } CIrrDeviceAndroid::~CIrrDeviceAndroid() { - Android->userData = NULL; - Android->onAppCmd = NULL; - Android->onInputEvent = NULL; + Android->userData = NULL; + Android->onAppCmd = NULL; + Android->onInputEvent = NULL; } void CIrrDeviceAndroid::printConfig() { - char language[3] = {}; - char country[3] = {}; - AConfiguration_getLanguage(Android->config, language); - AConfiguration_getCountry(Android->config, country); - int32_t mcc = AConfiguration_getMcc(Android->config); - int32_t mnc = AConfiguration_getMnc(Android->config); - int32_t orientation = AConfiguration_getOrientation(Android->config); - int32_t touch = AConfiguration_getTouchscreen(Android->config); - int32_t density = AConfiguration_getDensity(Android->config); - int32_t keyboard = AConfiguration_getKeyboard(Android->config); - int32_t navigation = AConfiguration_getNavigation(Android->config); - int32_t keys_hidden = AConfiguration_getKeysHidden(Android->config); - int32_t nav_hidden = AConfiguration_getNavHidden(Android->config); - int32_t sdk_version = AConfiguration_getSdkVersion(Android->config); - int32_t screen_size = AConfiguration_getScreenSize(Android->config); - int32_t screen_long = AConfiguration_getScreenLong(Android->config); - int32_t ui_mode_type = AConfiguration_getUiModeType(Android->config); - int32_t ui_mode_night = AConfiguration_getUiModeNight(Android->config); + char language[3] = {}; + char country[3] = {}; + AConfiguration_getLanguage(Android->config, language); + AConfiguration_getCountry(Android->config, country); + int32_t mcc = AConfiguration_getMcc(Android->config); + int32_t mnc = AConfiguration_getMnc(Android->config); + int32_t orientation = AConfiguration_getOrientation(Android->config); + int32_t touch = AConfiguration_getTouchscreen(Android->config); + int32_t density = AConfiguration_getDensity(Android->config); + int32_t keyboard = AConfiguration_getKeyboard(Android->config); + int32_t navigation = AConfiguration_getNavigation(Android->config); + int32_t keys_hidden = AConfiguration_getKeysHidden(Android->config); + int32_t nav_hidden = AConfiguration_getNavHidden(Android->config); + int32_t sdk_version = AConfiguration_getSdkVersion(Android->config); + int32_t screen_size = AConfiguration_getScreenSize(Android->config); + int32_t screen_long = AConfiguration_getScreenLong(Android->config); + int32_t ui_mode_type = AConfiguration_getUiModeType(Android->config); + int32_t ui_mode_night = AConfiguration_getUiModeNight(Android->config); - os::Printer::log("Android configuration: ", ELL_DEBUG); - os::Printer::log(" country:", country != NULL ? country : "unknown", ELL_DEBUG); - os::Printer::log(" density:", core::stringc(density).c_str(), ELL_DEBUG); - os::Printer::log(" keyboard:", core::stringc(keyboard).c_str(), ELL_DEBUG); - os::Printer::log(" keys_hidden:", core::stringc(keys_hidden).c_str(), ELL_DEBUG); - os::Printer::log(" language:", language != NULL ? language : "unknown", ELL_DEBUG); - os::Printer::log(" mcc:", core::stringc(mcc).c_str(), ELL_DEBUG); - os::Printer::log(" mnc:", core::stringc(mnc).c_str(), ELL_DEBUG); - os::Printer::log(" nav_hidden:", core::stringc(nav_hidden).c_str(), ELL_DEBUG); - os::Printer::log(" navigation:", core::stringc(navigation).c_str(), ELL_DEBUG); - os::Printer::log(" orientation:", core::stringc(orientation).c_str(), ELL_DEBUG); - os::Printer::log(" screen_long:", core::stringc(screen_long).c_str(), ELL_DEBUG); - os::Printer::log(" screen_size:", core::stringc(screen_size).c_str(), ELL_DEBUG); - os::Printer::log(" sdk_version:", core::stringc(sdk_version).c_str(), ELL_DEBUG); - os::Printer::log(" touch:", core::stringc(touch).c_str(), ELL_DEBUG); - os::Printer::log(" ui_mode_type:", core::stringc(ui_mode_type).c_str(), ELL_DEBUG); - os::Printer::log(" ui_mode_night:", core::stringc(ui_mode_night).c_str(), ELL_DEBUG); - - int rotation = getRotation(); - int deg[4] = {0, 90, 180, 270}; - - os::Printer::log("Rotation: ", core::stringc(deg[rotation]).c_str(), ELL_DEBUG); - - int default_rotation = getDefaultRotation(); - - if (default_rotation == 1) - { - os::Printer::log("Default rotation: landscape", ELL_DEBUG); - } - else - { - os::Printer::log("Default rotation: portrait", ELL_DEBUG); - } + os::Printer::log("Android configuration: ", ELL_DEBUG); + os::Printer::log(" country:", country != NULL ? country : "unknown", ELL_DEBUG); + os::Printer::log(" density:", core::stringc(density).c_str(), ELL_DEBUG); + os::Printer::log(" keyboard:", core::stringc(keyboard).c_str(), ELL_DEBUG); + os::Printer::log(" keys_hidden:", core::stringc(keys_hidden).c_str(), ELL_DEBUG); + os::Printer::log(" language:", language != NULL ? language : "unknown", ELL_DEBUG); + os::Printer::log(" mcc:", core::stringc(mcc).c_str(), ELL_DEBUG); + os::Printer::log(" mnc:", core::stringc(mnc).c_str(), ELL_DEBUG); + os::Printer::log(" nav_hidden:", core::stringc(nav_hidden).c_str(), ELL_DEBUG); + os::Printer::log(" navigation:", core::stringc(navigation).c_str(), ELL_DEBUG); + os::Printer::log(" orientation:", core::stringc(orientation).c_str(), ELL_DEBUG); + os::Printer::log(" screen_long:", core::stringc(screen_long).c_str(), ELL_DEBUG); + os::Printer::log(" screen_size:", core::stringc(screen_size).c_str(), ELL_DEBUG); + os::Printer::log(" sdk_version:", core::stringc(sdk_version).c_str(), ELL_DEBUG); + os::Printer::log(" touch:", core::stringc(touch).c_str(), ELL_DEBUG); + os::Printer::log(" ui_mode_type:", core::stringc(ui_mode_type).c_str(), ELL_DEBUG); + os::Printer::log(" ui_mode_night:", core::stringc(ui_mode_night).c_str(), ELL_DEBUG); + + int rotation = getRotation(); + int deg[4] = {0, 90, 180, 270}; + + os::Printer::log("Rotation: ", core::stringc(deg[rotation]).c_str(), ELL_DEBUG); + + int default_rotation = getDefaultRotation(); + + if (default_rotation == 1) + { + os::Printer::log("Default rotation: landscape", ELL_DEBUG); + } + else + { + os::Printer::log("Default rotation: portrait", ELL_DEBUG); + } } void CIrrDeviceAndroid::createVideoModeList() { - if (VideoModeList.getVideoModeCount() > 0) - return; - - int width = ANativeWindow_getWidth(Android->window); - int height = ANativeWindow_getHeight(Android->window); - - if (width > 0 && height > 0) - { - CreationParams.WindowSize.Width = width; - CreationParams.WindowSize.Height = height; - } + if (VideoModeList.getVideoModeCount() > 0) + return; + + int width = ANativeWindow_getWidth(Android->window); + int height = ANativeWindow_getHeight(Android->window); + + if (width > 0 && height > 0) + { + CreationParams.WindowSize.Width = width; + CreationParams.WindowSize.Height = height; + } - core::dimension2d size = core::dimension2d( - CreationParams.WindowSize.Width, - CreationParams.WindowSize.Height); + core::dimension2d size = core::dimension2d( + CreationParams.WindowSize.Width, + CreationParams.WindowSize.Height); - VideoModeList.addMode(size, 32); - VideoModeList.setDesktop(32, size); + VideoModeList.addMode(size, 32); + VideoModeList.setDesktop(32, size); } void CIrrDeviceAndroid::createDriver() { - // Create the driver. - switch(CreationParams.DriverType) - { - case video::EDT_OGLES2: - #ifdef _IRR_COMPILE_WITH_OGLES2_ - VideoDriver = video::createOGLES2Driver(CreationParams, ExposedVideoData, FileSystem); - #else - os::Printer::log("No OpenGL ES 2.0 support compiled in.", ELL_ERROR); - #endif - break; + // Create the driver. + switch(CreationParams.DriverType) + { + case video::EDT_OGLES2: + #ifdef _IRR_COMPILE_WITH_OGLES2_ + VideoDriver = video::createOGLES2Driver(CreationParams, ExposedVideoData, FileSystem); + #else + os::Printer::log("No OpenGL ES 2.0 support compiled in.", ELL_ERROR); + #endif + break; - case video::EDT_NULL: - VideoDriver = video::createNullDriver(FileSystem, CreationParams.WindowSize); - break; + case video::EDT_NULL: + VideoDriver = video::createNullDriver(FileSystem, CreationParams.WindowSize); + break; - default: - os::Printer::log("Unable to create video driver of unknown type.", ELL_ERROR); - break; - } + default: + os::Printer::log("Unable to create video driver of unknown type.", ELL_ERROR); + break; + } } bool CIrrDeviceAndroid::run() { - os::Timer::tick(); - - while (!Close) - { - s32 Events = 0; - android_poll_source* Source = 0; - bool should_run = (IsStarted && IsFocused && !IsPaused); - s32 id = ALooper_pollAll(should_run ? 0 : -1, NULL, &Events, - (void**)&Source); + os::Timer::tick(); + + while (!Close) + { + s32 Events = 0; + android_poll_source* Source = 0; + bool should_run = (IsStarted && IsFocused && !IsPaused); + s32 id = ALooper_pollAll(should_run ? 0 : -1, NULL, &Events, + (void**)&Source); - if (id < 0) - break; + if (id < 0) + break; - if (Source) - { - Source->process(Android, Source); - } + if (Source) + { + Source->process(Android, Source); + } - // if a sensor has data, we'll process it now. - if (id == LOOPER_ID_USER) - { - ASensorEvent event; - while (ASensorEventQueue_getEvents(SensorEventQueue, &event, 1) > 0) - { - switch (event.type) - { - case ASENSOR_TYPE_ACCELEROMETER: - SEvent accEvent; - accEvent.EventType = EET_ACCELEROMETER_EVENT; - accEvent.AccelerometerEvent.X = event.acceleration.x; - accEvent.AccelerometerEvent.Y = event.acceleration.y; - accEvent.AccelerometerEvent.Z = event.acceleration.z; + // if a sensor has data, we'll process it now. + if (id == LOOPER_ID_USER) + { + ASensorEvent event; + while (ASensorEventQueue_getEvents(SensorEventQueue, &event, 1) > 0) + { + switch (event.type) + { + case ASENSOR_TYPE_ACCELEROMETER: + SEvent accEvent; + accEvent.EventType = EET_ACCELEROMETER_EVENT; + accEvent.AccelerometerEvent.X = event.acceleration.x; + accEvent.AccelerometerEvent.Y = event.acceleration.y; + accEvent.AccelerometerEvent.Z = event.acceleration.z; - postEventFromUser(accEvent); - break; + postEventFromUser(accEvent); + break; - case ASENSOR_TYPE_GYROSCOPE: - SEvent gyroEvent; - gyroEvent.EventType = EET_GYROSCOPE_EVENT; - gyroEvent.GyroscopeEvent.X = event.vector.x; - gyroEvent.GyroscopeEvent.Y = event.vector.y; - gyroEvent.GyroscopeEvent.Z = event.vector.z; + case ASENSOR_TYPE_GYROSCOPE: + SEvent gyroEvent; + gyroEvent.EventType = EET_GYROSCOPE_EVENT; + gyroEvent.GyroscopeEvent.X = event.vector.x; + gyroEvent.GyroscopeEvent.Y = event.vector.y; + gyroEvent.GyroscopeEvent.Z = event.vector.z; - postEventFromUser(gyroEvent); - break; - default: - break; - } - } - } - } + postEventFromUser(gyroEvent); + break; + default: + break; + } + } + } + } - return !Close; + return !Close; } void CIrrDeviceAndroid::yield() { - struct timespec ts = {0,1}; - nanosleep(&ts, NULL); + struct timespec ts = {0,1}; + nanosleep(&ts, NULL); } void CIrrDeviceAndroid::sleep(u32 timeMs, bool pauseTimer) { - const bool wasStopped = Timer ? Timer->isStopped() : true; + const bool wasStopped = Timer ? Timer->isStopped() : true; - struct timespec ts; - ts.tv_sec = (time_t) (timeMs / 1000); - ts.tv_nsec = (long) (timeMs % 1000) * 1000000; + struct timespec ts; + ts.tv_sec = (time_t) (timeMs / 1000); + ts.tv_nsec = (long) (timeMs % 1000) * 1000000; - if (pauseTimer && !wasStopped) - Timer->stop(); + if (pauseTimer && !wasStopped) + Timer->stop(); - nanosleep(&ts, NULL); + nanosleep(&ts, NULL); - if (pauseTimer && !wasStopped) - Timer->start(); + if (pauseTimer && !wasStopped) + Timer->start(); } void CIrrDeviceAndroid::setWindowCaption(const wchar_t* text) @@ -304,29 +304,29 @@ void CIrrDeviceAndroid::setWindowCaption(const wchar_t* text) } bool CIrrDeviceAndroid::present(video::IImage* surface, void* windowId, - core::rect* srcClip) + core::rect* srcClip) { - return true; + return true; } bool CIrrDeviceAndroid::isWindowActive() const { - return (IsFocused && !IsPaused); + return (IsFocused && !IsPaused); } bool CIrrDeviceAndroid::isWindowFocused() const { - return IsFocused; + return IsFocused; } bool CIrrDeviceAndroid::isWindowMinimized() const { - return IsPaused; + return IsPaused; } void CIrrDeviceAndroid::closeDevice() { - Close = true; + Close = true; } void CIrrDeviceAndroid::setResizable(bool resize) @@ -347,934 +347,934 @@ void CIrrDeviceAndroid::restoreWindow() bool CIrrDeviceAndroid::moveWindow(int x, int y) { - return true; + return true; } bool CIrrDeviceAndroid::getWindowPosition(int* x, int* y) { - *x = 0; - *y = 0; - return true; + *x = 0; + *y = 0; + return true; } E_DEVICE_TYPE CIrrDeviceAndroid::getType() const { - return EIDT_ANDROID; + return EIDT_ANDROID; } void CIrrDeviceAndroid::handleAndroidCommand(android_app* app, int32_t cmd) { - CIrrDeviceAndroid* device = (CIrrDeviceAndroid *)app->userData; - assert(device != NULL); - - switch (cmd) - { - case APP_CMD_SAVE_STATE: - os::Printer::log("Android command APP_CMD_SAVE_STATE", ELL_DEBUG); - break; - case APP_CMD_INIT_WINDOW: - os::Printer::log("Android command APP_CMD_INIT_WINDOW", ELL_DEBUG); - - device->getExposedVideoData().OGLESAndroid.Window = app->window; - - // If the Android app is resumed, we need to re-create EGL surface - // to allow to draw something on it again. - if (device->VideoDriver != NULL && - device->CreationParams.DriverType == video::EDT_OGLES2) - { - video::COGLES2Driver* driver = (video::COGLES2Driver*)(device->VideoDriver); - driver->getEGLContext()->reloadEGLSurface(app->window); - } - - IsStarted = true; - break; - case APP_CMD_TERM_WINDOW: - os::Printer::log("Android command APP_CMD_TERM_WINDOW", ELL_DEBUG); - IsStarted = false; - break; - case APP_CMD_GAINED_FOCUS: - os::Printer::log("Android command APP_CMD_GAINED_FOCUS", ELL_DEBUG); - IsFocused = true; - break; - case APP_CMD_LOST_FOCUS: - os::Printer::log("Android command APP_CMD_LOST_FOCUS", ELL_DEBUG); - IsFocused = false; - break; - case APP_CMD_DESTROY: - os::Printer::log("Android command APP_CMD_DESTROY", ELL_DEBUG); - device->Close = true; - // Make sure that state variables are set to the default state - // when the app is destroyed - IsPaused = true; - IsFocused = false; - IsStarted = false; - break; - case APP_CMD_PAUSE: - os::Printer::log("Android command APP_CMD_PAUSE", ELL_DEBUG); - IsPaused = true; - break; - case APP_CMD_RESUME: - os::Printer::log("Android command APP_CMD_RESUME", ELL_DEBUG); - IsPaused = false; - break; - case APP_CMD_START: - os::Printer::log("Android command APP_CMD_START", ELL_DEBUG); - break; - case APP_CMD_STOP: - os::Printer::log("Android command APP_CMD_STOP", ELL_DEBUG); - break; - case APP_CMD_WINDOW_RESIZED: - os::Printer::log("Android command APP_CMD_WINDOW_RESIZED", ELL_DEBUG); - break; - case APP_CMD_CONFIG_CHANGED: - os::Printer::log("Android command APP_CMD_CONFIG_CHANGED", ELL_DEBUG); - break; - case APP_CMD_LOW_MEMORY: - os::Printer::log("Android command APP_CMD_LOW_MEMORY", ELL_DEBUG); - break; - default: - os::Printer::log("Android command: ", core::stringc(cmd).c_str(), ELL_DEBUG); - break; - } - - SEvent event; - event.EventType = EET_SYSTEM_EVENT; - event.SystemEvent.EventType = ESET_ANDROID_CMD; - event.SystemEvent.AndroidCmd.Cmd = cmd; - device->postEventFromUser(event); + CIrrDeviceAndroid* device = (CIrrDeviceAndroid *)app->userData; + assert(device != NULL); + + switch (cmd) + { + case APP_CMD_SAVE_STATE: + os::Printer::log("Android command APP_CMD_SAVE_STATE", ELL_DEBUG); + break; + case APP_CMD_INIT_WINDOW: + os::Printer::log("Android command APP_CMD_INIT_WINDOW", ELL_DEBUG); + + device->getExposedVideoData().OGLESAndroid.Window = app->window; + + // If the Android app is resumed, we need to re-create EGL surface + // to allow to draw something on it again. + if (device->VideoDriver != NULL && + device->CreationParams.DriverType == video::EDT_OGLES2) + { + video::COGLES2Driver* driver = (video::COGLES2Driver*)(device->VideoDriver); + driver->getEGLContext()->reloadEGLSurface(app->window); + } + + IsStarted = true; + break; + case APP_CMD_TERM_WINDOW: + os::Printer::log("Android command APP_CMD_TERM_WINDOW", ELL_DEBUG); + IsStarted = false; + break; + case APP_CMD_GAINED_FOCUS: + os::Printer::log("Android command APP_CMD_GAINED_FOCUS", ELL_DEBUG); + IsFocused = true; + break; + case APP_CMD_LOST_FOCUS: + os::Printer::log("Android command APP_CMD_LOST_FOCUS", ELL_DEBUG); + IsFocused = false; + break; + case APP_CMD_DESTROY: + os::Printer::log("Android command APP_CMD_DESTROY", ELL_DEBUG); + device->Close = true; + // Make sure that state variables are set to the default state + // when the app is destroyed + IsPaused = true; + IsFocused = false; + IsStarted = false; + break; + case APP_CMD_PAUSE: + os::Printer::log("Android command APP_CMD_PAUSE", ELL_DEBUG); + IsPaused = true; + break; + case APP_CMD_RESUME: + os::Printer::log("Android command APP_CMD_RESUME", ELL_DEBUG); + IsPaused = false; + break; + case APP_CMD_START: + os::Printer::log("Android command APP_CMD_START", ELL_DEBUG); + break; + case APP_CMD_STOP: + os::Printer::log("Android command APP_CMD_STOP", ELL_DEBUG); + break; + case APP_CMD_WINDOW_RESIZED: + os::Printer::log("Android command APP_CMD_WINDOW_RESIZED", ELL_DEBUG); + break; + case APP_CMD_CONFIG_CHANGED: + os::Printer::log("Android command APP_CMD_CONFIG_CHANGED", ELL_DEBUG); + break; + case APP_CMD_LOW_MEMORY: + os::Printer::log("Android command APP_CMD_LOW_MEMORY", ELL_DEBUG); + break; + default: + os::Printer::log("Android command: ", core::stringc(cmd).c_str(), ELL_DEBUG); + break; + } + + SEvent event; + event.EventType = EET_SYSTEM_EVENT; + event.SystemEvent.EventType = ESET_ANDROID_CMD; + event.SystemEvent.AndroidCmd.Cmd = cmd; + device->postEventFromUser(event); } s32 CIrrDeviceAndroid::handleInput(android_app* app, AInputEvent* androidEvent) { - CIrrDeviceAndroid* device = (CIrrDeviceAndroid*)app->userData; - assert(device != NULL); - - s32 status = 0; - - int32_t source = AInputEvent_getSource(androidEvent); - int32_t type = AInputEvent_getType(androidEvent); - - if (source == AINPUT_SOURCE_GAMEPAD || - source == AINPUT_SOURCE_JOYSTICK || - source == AINPUT_SOURCE_DPAD) - { - status = device->handleGamepad(androidEvent); - } - else - { - switch (type) - { - case AINPUT_EVENT_TYPE_MOTION: - { - status = device->handleTouch(androidEvent); - break; - } - case AINPUT_EVENT_TYPE_KEY: - { - status = device->handleKeyboard(androidEvent); - break; - } - default: - break; - } - } + CIrrDeviceAndroid* device = (CIrrDeviceAndroid*)app->userData; + assert(device != NULL); + + s32 status = 0; + + int32_t source = AInputEvent_getSource(androidEvent); + int32_t type = AInputEvent_getType(androidEvent); + + if (source == AINPUT_SOURCE_GAMEPAD || + source == AINPUT_SOURCE_JOYSTICK || + source == AINPUT_SOURCE_DPAD) + { + status = device->handleGamepad(androidEvent); + } + else + { + switch (type) + { + case AINPUT_EVENT_TYPE_MOTION: + { + status = device->handleTouch(androidEvent); + break; + } + case AINPUT_EVENT_TYPE_KEY: + { + status = device->handleKeyboard(androidEvent); + break; + } + default: + break; + } + } - return status; + return status; } s32 CIrrDeviceAndroid::handleTouch(AInputEvent* androidEvent) { - s32 status = 0; - - SEvent event; - event.EventType = EET_TOUCH_INPUT_EVENT; + s32 status = 0; + + SEvent event; + event.EventType = EET_TOUCH_INPUT_EVENT; - s32 eventAction = AMotionEvent_getAction(androidEvent); + s32 eventAction = AMotionEvent_getAction(androidEvent); #if 0 - // Useful for debugging. We might have to pass some of those infos on at some point. - // but preferably device independent (so iphone can use same irrlicht flags). - int32_t flags = AMotionEvent_getFlags(androidEvent); - os::Printer::log("flags: ", core::stringc(flags).c_str(), ELL_DEBUG); - int32_t metaState = AMotionEvent_getMetaState(androidEvent); - os::Printer::log("metaState: ", core::stringc(metaState).c_str(), ELL_DEBUG); - int32_t edgeFlags = AMotionEvent_getEdgeFlags(androidEvent); - os::Printer::log("edgeFlags: ", core::stringc(flags).c_str(), ELL_DEBUG); + // Useful for debugging. We might have to pass some of those infos on at some point. + // but preferably device independent (so iphone can use same irrlicht flags). + int32_t flags = AMotionEvent_getFlags(androidEvent); + os::Printer::log("flags: ", core::stringc(flags).c_str(), ELL_DEBUG); + int32_t metaState = AMotionEvent_getMetaState(androidEvent); + os::Printer::log("metaState: ", core::stringc(metaState).c_str(), ELL_DEBUG); + int32_t edgeFlags = AMotionEvent_getEdgeFlags(androidEvent); + os::Printer::log("edgeFlags: ", core::stringc(flags).c_str(), ELL_DEBUG); #endif - bool touchReceived = true; - bool simulate_mouse = false; - core::position2d mouse_pos = core::position2d(0, 0); + bool touchReceived = true; + bool simulate_mouse = false; + core::position2d mouse_pos = core::position2d(0, 0); - switch (eventAction & AMOTION_EVENT_ACTION_MASK) - { - case AMOTION_EVENT_ACTION_DOWN: - case AMOTION_EVENT_ACTION_POINTER_DOWN: - event.TouchInput.Event = ETIE_PRESSED_DOWN; - break; - case AMOTION_EVENT_ACTION_MOVE: - event.TouchInput.Event = ETIE_MOVED; - break; - case AMOTION_EVENT_ACTION_UP: - case AMOTION_EVENT_ACTION_POINTER_UP: - case AMOTION_EVENT_ACTION_CANCEL: - event.TouchInput.Event = ETIE_LEFT_UP; - break; - default: - touchReceived = false; - break; - } - - if (touchReceived) - { - s32 count = 1; - s32 idx = (eventAction & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> - AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT; - - // Process all touches for move action. - if (event.TouchInput.Event == ETIE_MOVED) - { - count = AMotionEvent_getPointerCount(androidEvent); - idx = 0; - } + switch (eventAction & AMOTION_EVENT_ACTION_MASK) + { + case AMOTION_EVENT_ACTION_DOWN: + case AMOTION_EVENT_ACTION_POINTER_DOWN: + event.TouchInput.Event = ETIE_PRESSED_DOWN; + break; + case AMOTION_EVENT_ACTION_MOVE: + event.TouchInput.Event = ETIE_MOVED; + break; + case AMOTION_EVENT_ACTION_UP: + case AMOTION_EVENT_ACTION_POINTER_UP: + case AMOTION_EVENT_ACTION_CANCEL: + event.TouchInput.Event = ETIE_LEFT_UP; + break; + default: + touchReceived = false; + break; + } + + if (touchReceived) + { + s32 count = 1; + s32 idx = (eventAction & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> + AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT; + + // Process all touches for move action. + if (event.TouchInput.Event == ETIE_MOVED) + { + count = AMotionEvent_getPointerCount(androidEvent); + idx = 0; + } - for (s32 i = 0; i < count; ++i) - { - event.TouchInput.ID = AMotionEvent_getPointerId(androidEvent, i + idx); - event.TouchInput.X = AMotionEvent_getX(androidEvent, i + idx); - event.TouchInput.Y = AMotionEvent_getY(androidEvent, i + idx); - - if (event.TouchInput.ID >= 32) - continue; - - TouchEventData& event_data = TouchEventsData[event.TouchInput.ID]; - - // Don't send move event when nothing changed - if (event_data.event == event.TouchInput.Event && - event_data.x == event.TouchInput.X && - event_data.y == event.TouchInput.Y) - continue; - - event_data.event = event.TouchInput.Event; - event_data.x = event.TouchInput.X; - event_data.y = event.TouchInput.Y; - - postEventFromUser(event); - - if (event.TouchInput.ID == 0) - { - simulate_mouse = true; - mouse_pos.X = event.TouchInput.X; - mouse_pos.Y = event.TouchInput.Y; - } - } + for (s32 i = 0; i < count; ++i) + { + event.TouchInput.ID = AMotionEvent_getPointerId(androidEvent, i + idx); + event.TouchInput.X = AMotionEvent_getX(androidEvent, i + idx); + event.TouchInput.Y = AMotionEvent_getY(androidEvent, i + idx); + + if (event.TouchInput.ID >= 32) + continue; + + TouchEventData& event_data = TouchEventsData[event.TouchInput.ID]; + + // Don't send move event when nothing changed + if (event_data.event == event.TouchInput.Event && + event_data.x == event.TouchInput.X && + event_data.y == event.TouchInput.Y) + continue; + + event_data.event = event.TouchInput.Event; + event_data.x = event.TouchInput.X; + event_data.y = event.TouchInput.Y; + + postEventFromUser(event); + + if (event.TouchInput.ID == 0) + { + simulate_mouse = true; + mouse_pos.X = event.TouchInput.X; + mouse_pos.Y = event.TouchInput.Y; + } + } - status = 1; - } - - // Simulate mouse event for first finger on multitouch device. - // This allows to click on GUI elements. - if (simulate_mouse) - { - CursorControl->setPosition(mouse_pos); + status = 1; + } + + // Simulate mouse event for first finger on multitouch device. + // This allows to click on GUI elements. + if (simulate_mouse) + { + CursorControl->setPosition(mouse_pos); - SEvent irrevent; - bool send_event = true; - - switch (event.TouchInput.Event) - { - case ETIE_PRESSED_DOWN: - irrevent.MouseInput.Event = EMIE_LMOUSE_PRESSED_DOWN; - IsMousePressed = true; - break; - case ETIE_LEFT_UP: - irrevent.MouseInput.Event = EMIE_LMOUSE_LEFT_UP; - IsMousePressed = false; - break; - case ETIE_MOVED: - irrevent.MouseInput.Event = EMIE_MOUSE_MOVED; - break; - default: - send_event = false; - break; - } - - if (send_event) - { - irrevent.MouseInput.Control = false; - irrevent.MouseInput.Shift = false; - irrevent.MouseInput.ButtonStates = IsMousePressed ? - irr::EMBSM_LEFT : 0; - irrevent.EventType = EET_MOUSE_INPUT_EVENT; - irrevent.MouseInput.X = mouse_pos.X; - irrevent.MouseInput.Y = mouse_pos.Y; + SEvent irrevent; + bool send_event = true; + + switch (event.TouchInput.Event) + { + case ETIE_PRESSED_DOWN: + irrevent.MouseInput.Event = EMIE_LMOUSE_PRESSED_DOWN; + IsMousePressed = true; + break; + case ETIE_LEFT_UP: + irrevent.MouseInput.Event = EMIE_LMOUSE_LEFT_UP; + IsMousePressed = false; + break; + case ETIE_MOVED: + irrevent.MouseInput.Event = EMIE_MOUSE_MOVED; + break; + default: + send_event = false; + break; + } + + if (send_event) + { + irrevent.MouseInput.Control = false; + irrevent.MouseInput.Shift = false; + irrevent.MouseInput.ButtonStates = IsMousePressed ? + irr::EMBSM_LEFT : 0; + irrevent.EventType = EET_MOUSE_INPUT_EVENT; + irrevent.MouseInput.X = mouse_pos.X; + irrevent.MouseInput.Y = mouse_pos.Y; - postEventFromUser(irrevent); - } - } - - return status; + postEventFromUser(irrevent); + } + } + + return status; } s32 CIrrDeviceAndroid::handleKeyboard(AInputEvent* androidEvent) { - s32 status = 0; + s32 status = 0; - bool ignore_event = false; + bool ignore_event = false; - SEvent event; - event.EventType = EET_KEY_INPUT_EVENT; - event.KeyInput.Char = 0; - event.KeyInput.PressedDown = false; - event.KeyInput.Key = IRR_KEY_UNKNOWN; + SEvent event; + event.EventType = EET_KEY_INPUT_EVENT; + event.KeyInput.Char = 0; + event.KeyInput.PressedDown = false; + event.KeyInput.Key = IRR_KEY_UNKNOWN; - int32_t keyCode = AKeyEvent_getKeyCode(androidEvent); - int32_t keyAction = AKeyEvent_getAction(androidEvent); - int32_t keyMetaState = AKeyEvent_getMetaState(androidEvent); - int32_t keyRepeat = AKeyEvent_getRepeatCount(androidEvent); - int32_t scanCode = AKeyEvent_getScanCode(androidEvent); - - if (keyAction == AKEY_EVENT_ACTION_DOWN) - { - event.KeyInput.PressedDown = true; - } - else if (keyAction == AKEY_EVENT_ACTION_UP) - { - event.KeyInput.PressedDown = false; - } - else if (keyAction == AKEY_EVENT_ACTION_MULTIPLE) - { - // TODO: Multiple duplicate key events have occurred in a row, - // or a complex string is being delivered. The repeat_count - // property of the key event contains the number of times the - // given key code should be executed. - // I guess this might necessary for more complicated i18n key input, - // but don't see yet how to handle this correctly. - } + int32_t keyCode = AKeyEvent_getKeyCode(androidEvent); + int32_t keyAction = AKeyEvent_getAction(androidEvent); + int32_t keyMetaState = AKeyEvent_getMetaState(androidEvent); + int32_t keyRepeat = AKeyEvent_getRepeatCount(androidEvent); + int32_t scanCode = AKeyEvent_getScanCode(androidEvent); + + if (keyAction == AKEY_EVENT_ACTION_DOWN) + { + event.KeyInput.PressedDown = true; + } + else if (keyAction == AKEY_EVENT_ACTION_UP) + { + event.KeyInput.PressedDown = false; + } + else if (keyAction == AKEY_EVENT_ACTION_MULTIPLE) + { + // TODO: Multiple duplicate key events have occurred in a row, + // or a complex string is being delivered. The repeat_count + // property of the key event contains the number of times the + // given key code should be executed. + // I guess this might necessary for more complicated i18n key input, + // but don't see yet how to handle this correctly. + } - event.KeyInput.Shift = (keyMetaState & AMETA_SHIFT_ON || - keyMetaState & AMETA_SHIFT_LEFT_ON || - keyMetaState & AMETA_SHIFT_RIGHT_ON); + event.KeyInput.Shift = (keyMetaState & AMETA_SHIFT_ON || + keyMetaState & AMETA_SHIFT_LEFT_ON || + keyMetaState & AMETA_SHIFT_RIGHT_ON); - event.KeyInput.Control = (keyMetaState & AMETA_CTRL_ON || - keyMetaState & AMETA_CTRL_LEFT_ON || - keyMetaState & AMETA_CTRL_RIGHT_ON); + event.KeyInput.Control = (keyMetaState & AMETA_CTRL_ON || + keyMetaState & AMETA_CTRL_LEFT_ON || + keyMetaState & AMETA_CTRL_RIGHT_ON); - event.KeyInput.SystemKeyCode = (u32)keyCode; - event.KeyInput.Key = KeyMap[keyCode]; + event.KeyInput.SystemKeyCode = (u32)keyCode; + event.KeyInput.Key = KeyMap[keyCode]; - if (event.KeyInput.Key > 0) - { - getKeyChar(event); - } - - // If button doesn't return key code, then at least use device-specific - // scan code, because it's better than nothing - if (event.KeyInput.Key == 0) - { - event.KeyInput.Key = (EKEY_CODE)scanCode; - } + if (event.KeyInput.Key > 0) + { + getKeyChar(event); + } + + // If button doesn't return key code, then at least use device-specific + // scan code, because it's better than nothing + if (event.KeyInput.Key == 0) + { + event.KeyInput.Key = (EKEY_CODE)scanCode; + } - // Handle an event when back button in pressed just like an escape key - // and also avoid repeating the event to avoid some strange behaviour - if (event.KeyInput.SystemKeyCode == AKEYCODE_BACK && - (event.KeyInput.PressedDown == false || keyRepeat > 0)) - { - ignore_event = true; - } + // Handle an event when back button in pressed just like an escape key + // and also avoid repeating the event to avoid some strange behaviour + if (event.KeyInput.SystemKeyCode == AKEYCODE_BACK && + (event.KeyInput.PressedDown == false || keyRepeat > 0)) + { + ignore_event = true; + } - // Mark escape key and gamepad buttons as handled by application to avoid - // receiving duplicated events - if (event.KeyInput.SystemKeyCode == AKEYCODE_ESCAPE || - event.KeyInput.SystemKeyCode == AKEYCODE_BACK || - (event.KeyInput.SystemKeyCode >= AKEYCODE_BUTTON_A && - event.KeyInput.SystemKeyCode <= AKEYCODE_BUTTON_MODE)) - { - status = 1; - } + // Mark escape key and gamepad buttons as handled by application to avoid + // receiving duplicated events + if (event.KeyInput.SystemKeyCode == AKEYCODE_ESCAPE || + event.KeyInput.SystemKeyCode == AKEYCODE_BACK || + (event.KeyInput.SystemKeyCode >= AKEYCODE_BUTTON_A && + event.KeyInput.SystemKeyCode <= AKEYCODE_BUTTON_MODE)) + { + status = 1; + } - if (!ignore_event) - { - postEventFromUser(event); - } + if (!ignore_event) + { + postEventFromUser(event); + } - return status; + return status; } s32 CIrrDeviceAndroid::handleGamepad(AInputEvent* androidEvent) { - s32 status = 0; - - int32_t type = AInputEvent_getType(androidEvent); - - switch (type) - { - case AINPUT_EVENT_TYPE_MOTION: - { - float axis_x = AMotionEvent_getAxisValue(androidEvent, - AMOTION_EVENT_AXIS_HAT_X, 0); + s32 status = 0; + + int32_t type = AInputEvent_getType(androidEvent); + + switch (type) + { + case AINPUT_EVENT_TYPE_MOTION: + { + float axis_x = AMotionEvent_getAxisValue(androidEvent, + AMOTION_EVENT_AXIS_HAT_X, 0); - if (axis_x == 0) - { - axis_x = AMotionEvent_getAxisValue(androidEvent, - AMOTION_EVENT_AXIS_X, 0); - } - - if (axis_x == 0) - { - axis_x = AMotionEvent_getAxisValue(androidEvent, - AMOTION_EVENT_AXIS_Z, 0); - } + if (axis_x == 0) + { + axis_x = AMotionEvent_getAxisValue(androidEvent, + AMOTION_EVENT_AXIS_X, 0); + } + + if (axis_x == 0) + { + axis_x = AMotionEvent_getAxisValue(androidEvent, + AMOTION_EVENT_AXIS_Z, 0); + } - float axis_y = AMotionEvent_getAxisValue(androidEvent, - AMOTION_EVENT_AXIS_HAT_Y, 0); - - if (axis_y == 0) - { - axis_y = AMotionEvent_getAxisValue(androidEvent, - AMOTION_EVENT_AXIS_Y, 0); - } - - if (axis_y == 0) - { - axis_y = AMotionEvent_getAxisValue(androidEvent, - AMOTION_EVENT_AXIS_RZ, 0); - } - - SEvent event; - event.EventType = EET_KEY_INPUT_EVENT; - event.KeyInput.Char = 0; - event.KeyInput.Shift = false; - event.KeyInput.Control = false; - event.KeyInput.SystemKeyCode = 0; - - float deadzone = 0.3f; - - axis_x = axis_x > deadzone || axis_x < -deadzone ? axis_x : 0; - axis_y = axis_y > deadzone || axis_y < -deadzone ? axis_y : 0; - - if (axis_x != GamepadAxisX) - { - if (GamepadAxisX != 0) - { - event.KeyInput.PressedDown = false; - event.KeyInput.Key = GamepadAxisX < 0 ? IRR_KEY_LEFT - : IRR_KEY_RIGHT; - postEventFromUser(event); - } - - if (axis_x != 0) - { - event.KeyInput.PressedDown = true; - event.KeyInput.Key = axis_x < 0 ? IRR_KEY_LEFT : IRR_KEY_RIGHT; - postEventFromUser(event); - } - - GamepadAxisX = axis_x; - } - - if (axis_y != GamepadAxisY) - { - if (GamepadAxisY != 0) - { - event.KeyInput.PressedDown = false; - event.KeyInput.Key = GamepadAxisY < 0 ? IRR_KEY_UP - : IRR_KEY_DOWN; - postEventFromUser(event); - } - - if (axis_y != 0) - { - event.KeyInput.PressedDown = true; - event.KeyInput.Key = axis_y < 0 ? IRR_KEY_UP : IRR_KEY_DOWN; - postEventFromUser(event); - } - - GamepadAxisY = axis_y; - } - - status = 1; + float axis_y = AMotionEvent_getAxisValue(androidEvent, + AMOTION_EVENT_AXIS_HAT_Y, 0); + + if (axis_y == 0) + { + axis_y = AMotionEvent_getAxisValue(androidEvent, + AMOTION_EVENT_AXIS_Y, 0); + } + + if (axis_y == 0) + { + axis_y = AMotionEvent_getAxisValue(androidEvent, + AMOTION_EVENT_AXIS_RZ, 0); + } + + SEvent event; + event.EventType = EET_KEY_INPUT_EVENT; + event.KeyInput.Char = 0; + event.KeyInput.Shift = false; + event.KeyInput.Control = false; + event.KeyInput.SystemKeyCode = 0; + + float deadzone = 0.3f; + + axis_x = axis_x > deadzone || axis_x < -deadzone ? axis_x : 0; + axis_y = axis_y > deadzone || axis_y < -deadzone ? axis_y : 0; + + if (axis_x != GamepadAxisX) + { + if (GamepadAxisX != 0) + { + event.KeyInput.PressedDown = false; + event.KeyInput.Key = GamepadAxisX < 0 ? IRR_KEY_LEFT + : IRR_KEY_RIGHT; + postEventFromUser(event); + } + + if (axis_x != 0) + { + event.KeyInput.PressedDown = true; + event.KeyInput.Key = axis_x < 0 ? IRR_KEY_LEFT : IRR_KEY_RIGHT; + postEventFromUser(event); + } + + GamepadAxisX = axis_x; + } + + if (axis_y != GamepadAxisY) + { + if (GamepadAxisY != 0) + { + event.KeyInput.PressedDown = false; + event.KeyInput.Key = GamepadAxisY < 0 ? IRR_KEY_UP + : IRR_KEY_DOWN; + postEventFromUser(event); + } + + if (axis_y != 0) + { + event.KeyInput.PressedDown = true; + event.KeyInput.Key = axis_y < 0 ? IRR_KEY_UP : IRR_KEY_DOWN; + postEventFromUser(event); + } + + GamepadAxisY = axis_y; + } + + status = 1; - break; - } - case AINPUT_EVENT_TYPE_KEY: - { - bool ignore = false; - - int32_t keyCode = AKeyEvent_getKeyCode(androidEvent); - int32_t keyAction = AKeyEvent_getAction(androidEvent); - int32_t keyRepeat = AKeyEvent_getRepeatCount(androidEvent); - int32_t scanCode = AKeyEvent_getScanCode(androidEvent); - - if (keyRepeat == 0) - { - bool ignore_event = false; - - SEvent event; - event.EventType = EET_KEY_INPUT_EVENT; - event.KeyInput.Char = 0; - event.KeyInput.PressedDown = (keyAction == AKEY_EVENT_ACTION_DOWN); - event.KeyInput.Shift = false; - event.KeyInput.Control = false; - event.KeyInput.SystemKeyCode = (u32)keyCode; - event.KeyInput.Key = KeyMap[keyCode]; - - if (event.KeyInput.Key == 0) - { - event.KeyInput.Key = (EKEY_CODE)scanCode; - } - - postEventFromUser(event); - } - - status = 1; - break; - } - default: - break; - } - - return status; + break; + } + case AINPUT_EVENT_TYPE_KEY: + { + bool ignore = false; + + int32_t keyCode = AKeyEvent_getKeyCode(androidEvent); + int32_t keyAction = AKeyEvent_getAction(androidEvent); + int32_t keyRepeat = AKeyEvent_getRepeatCount(androidEvent); + int32_t scanCode = AKeyEvent_getScanCode(androidEvent); + + if (keyRepeat == 0) + { + bool ignore_event = false; + + SEvent event; + event.EventType = EET_KEY_INPUT_EVENT; + event.KeyInput.Char = 0; + event.KeyInput.PressedDown = (keyAction == AKEY_EVENT_ACTION_DOWN); + event.KeyInput.Shift = false; + event.KeyInput.Control = false; + event.KeyInput.SystemKeyCode = (u32)keyCode; + event.KeyInput.Key = KeyMap[keyCode]; + + if (event.KeyInput.Key == 0) + { + event.KeyInput.Key = (EKEY_CODE)scanCode; + } + + postEventFromUser(event); + } + + status = 1; + break; + } + default: + break; + } + + return status; } video::SExposedVideoData& CIrrDeviceAndroid::getExposedVideoData() { - return ExposedVideoData; + return ExposedVideoData; } void CIrrDeviceAndroid::createKeyMap() { - KeyMap[AKEYCODE_UNKNOWN] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_SOFT_LEFT] = IRR_KEY_LBUTTON; - KeyMap[AKEYCODE_SOFT_RIGHT] = IRR_KEY_RBUTTON; - KeyMap[AKEYCODE_HOME] = IRR_KEY_HOME; - KeyMap[AKEYCODE_BACK] = IRR_KEY_ESCAPE; - KeyMap[AKEYCODE_CALL] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_ENDCALL] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_0] = IRR_KEY_0; - KeyMap[AKEYCODE_1] = IRR_KEY_1; - KeyMap[AKEYCODE_2] = IRR_KEY_2; - KeyMap[AKEYCODE_3] = IRR_KEY_3; - KeyMap[AKEYCODE_4] = IRR_KEY_4; - KeyMap[AKEYCODE_5] = IRR_KEY_5; - KeyMap[AKEYCODE_6] = IRR_KEY_6; - KeyMap[AKEYCODE_7] = IRR_KEY_7; - KeyMap[AKEYCODE_8] = IRR_KEY_8; - KeyMap[AKEYCODE_9] = IRR_KEY_9; - KeyMap[AKEYCODE_STAR] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_POUND] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_DPAD_UP] = IRR_KEY_UP; - KeyMap[AKEYCODE_DPAD_DOWN] = IRR_KEY_DOWN; - KeyMap[AKEYCODE_DPAD_LEFT] = IRR_KEY_LEFT; - KeyMap[AKEYCODE_DPAD_RIGHT] = IRR_KEY_RIGHT; - KeyMap[AKEYCODE_DPAD_CENTER] = IRR_KEY_RETURN; - KeyMap[AKEYCODE_VOLUME_UP] = IRR_KEY_VOLUME_DOWN; - KeyMap[AKEYCODE_VOLUME_DOWN] = IRR_KEY_VOLUME_UP; - KeyMap[AKEYCODE_POWER] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_CAMERA] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_CLEAR] = IRR_KEY_CLEAR; - KeyMap[AKEYCODE_A] = IRR_KEY_A; - KeyMap[AKEYCODE_B] = IRR_KEY_B; - KeyMap[AKEYCODE_C] = IRR_KEY_C; - KeyMap[AKEYCODE_D] = IRR_KEY_D; - KeyMap[AKEYCODE_E] = IRR_KEY_E; - KeyMap[AKEYCODE_F] = IRR_KEY_F; - KeyMap[AKEYCODE_G] = IRR_KEY_G; - KeyMap[AKEYCODE_H] = IRR_KEY_H; - KeyMap[AKEYCODE_I] = IRR_KEY_I; - KeyMap[AKEYCODE_J] = IRR_KEY_J; - KeyMap[AKEYCODE_K] = IRR_KEY_K; - KeyMap[AKEYCODE_L] = IRR_KEY_L; - KeyMap[AKEYCODE_M] = IRR_KEY_M; - KeyMap[AKEYCODE_N] = IRR_KEY_N; - KeyMap[AKEYCODE_O] = IRR_KEY_O; - KeyMap[AKEYCODE_P] = IRR_KEY_P; - KeyMap[AKEYCODE_Q] = IRR_KEY_Q; - KeyMap[AKEYCODE_R] = IRR_KEY_R; - KeyMap[AKEYCODE_S] = IRR_KEY_S; - KeyMap[AKEYCODE_T] = IRR_KEY_T; - KeyMap[AKEYCODE_U] = IRR_KEY_U; - KeyMap[AKEYCODE_V] = IRR_KEY_V; - KeyMap[AKEYCODE_W] = IRR_KEY_W; - KeyMap[AKEYCODE_X] = IRR_KEY_X; - KeyMap[AKEYCODE_Y] = IRR_KEY_Y; - KeyMap[AKEYCODE_Z] = IRR_KEY_Z; - KeyMap[AKEYCODE_COMMA] = IRR_KEY_COMMA; - KeyMap[AKEYCODE_PERIOD] = IRR_KEY_PERIOD; - KeyMap[AKEYCODE_ALT_LEFT] = IRR_KEY_MENU; - KeyMap[AKEYCODE_ALT_RIGHT] = IRR_KEY_MENU; - KeyMap[AKEYCODE_SHIFT_LEFT] = IRR_KEY_LSHIFT; - KeyMap[AKEYCODE_SHIFT_RIGHT] = IRR_KEY_RSHIFT; - KeyMap[AKEYCODE_TAB] = IRR_KEY_TAB; - KeyMap[AKEYCODE_SPACE] = IRR_KEY_SPACE; - KeyMap[AKEYCODE_SYM] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_EXPLORER] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_ENVELOPE] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_ENTER] = IRR_KEY_RETURN; - KeyMap[AKEYCODE_DEL] = IRR_KEY_BACK; - KeyMap[AKEYCODE_GRAVE] = IRR_KEY_OEM_3; - KeyMap[AKEYCODE_MINUS] = IRR_KEY_MINUS; - KeyMap[AKEYCODE_EQUALS] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_LEFT_BRACKET] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_RIGHT_BRACKET] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BACKSLASH] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_SEMICOLON] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_APOSTROPHE] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_SLASH] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_AT] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_NUM] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_HEADSETHOOK] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_FOCUS] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_PLUS] = IRR_KEY_PLUS; - KeyMap[AKEYCODE_MENU] = IRR_KEY_MENU; - KeyMap[AKEYCODE_NOTIFICATION] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_SEARCH] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_MEDIA_PLAY_PAUSE] = IRR_KEY_MEDIA_PLAY_PAUSE; - KeyMap[AKEYCODE_MEDIA_STOP] = IRR_KEY_MEDIA_STOP; - KeyMap[AKEYCODE_MEDIA_NEXT] = IRR_KEY_MEDIA_NEXT_TRACK; - KeyMap[AKEYCODE_MEDIA_PREVIOUS] = IRR_KEY_MEDIA_PREV_TRACK; - KeyMap[AKEYCODE_MEDIA_REWIND] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_MEDIA_FAST_FORWARD] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_MUTE] = IRR_KEY_VOLUME_MUTE; - KeyMap[AKEYCODE_PAGE_UP] = IRR_KEY_PRIOR; - KeyMap[AKEYCODE_PAGE_DOWN] = IRR_KEY_NEXT; - KeyMap[AKEYCODE_PICTSYMBOLS] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_SWITCH_CHARSET] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_UNKNOWN] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_SOFT_LEFT] = IRR_KEY_LBUTTON; + KeyMap[AKEYCODE_SOFT_RIGHT] = IRR_KEY_RBUTTON; + KeyMap[AKEYCODE_HOME] = IRR_KEY_HOME; + KeyMap[AKEYCODE_BACK] = IRR_KEY_ESCAPE; + KeyMap[AKEYCODE_CALL] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_ENDCALL] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_0] = IRR_KEY_0; + KeyMap[AKEYCODE_1] = IRR_KEY_1; + KeyMap[AKEYCODE_2] = IRR_KEY_2; + KeyMap[AKEYCODE_3] = IRR_KEY_3; + KeyMap[AKEYCODE_4] = IRR_KEY_4; + KeyMap[AKEYCODE_5] = IRR_KEY_5; + KeyMap[AKEYCODE_6] = IRR_KEY_6; + KeyMap[AKEYCODE_7] = IRR_KEY_7; + KeyMap[AKEYCODE_8] = IRR_KEY_8; + KeyMap[AKEYCODE_9] = IRR_KEY_9; + KeyMap[AKEYCODE_STAR] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_POUND] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_DPAD_UP] = IRR_KEY_UP; + KeyMap[AKEYCODE_DPAD_DOWN] = IRR_KEY_DOWN; + KeyMap[AKEYCODE_DPAD_LEFT] = IRR_KEY_LEFT; + KeyMap[AKEYCODE_DPAD_RIGHT] = IRR_KEY_RIGHT; + KeyMap[AKEYCODE_DPAD_CENTER] = IRR_KEY_RETURN; + KeyMap[AKEYCODE_VOLUME_UP] = IRR_KEY_VOLUME_DOWN; + KeyMap[AKEYCODE_VOLUME_DOWN] = IRR_KEY_VOLUME_UP; + KeyMap[AKEYCODE_POWER] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_CAMERA] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_CLEAR] = IRR_KEY_CLEAR; + KeyMap[AKEYCODE_A] = IRR_KEY_A; + KeyMap[AKEYCODE_B] = IRR_KEY_B; + KeyMap[AKEYCODE_C] = IRR_KEY_C; + KeyMap[AKEYCODE_D] = IRR_KEY_D; + KeyMap[AKEYCODE_E] = IRR_KEY_E; + KeyMap[AKEYCODE_F] = IRR_KEY_F; + KeyMap[AKEYCODE_G] = IRR_KEY_G; + KeyMap[AKEYCODE_H] = IRR_KEY_H; + KeyMap[AKEYCODE_I] = IRR_KEY_I; + KeyMap[AKEYCODE_J] = IRR_KEY_J; + KeyMap[AKEYCODE_K] = IRR_KEY_K; + KeyMap[AKEYCODE_L] = IRR_KEY_L; + KeyMap[AKEYCODE_M] = IRR_KEY_M; + KeyMap[AKEYCODE_N] = IRR_KEY_N; + KeyMap[AKEYCODE_O] = IRR_KEY_O; + KeyMap[AKEYCODE_P] = IRR_KEY_P; + KeyMap[AKEYCODE_Q] = IRR_KEY_Q; + KeyMap[AKEYCODE_R] = IRR_KEY_R; + KeyMap[AKEYCODE_S] = IRR_KEY_S; + KeyMap[AKEYCODE_T] = IRR_KEY_T; + KeyMap[AKEYCODE_U] = IRR_KEY_U; + KeyMap[AKEYCODE_V] = IRR_KEY_V; + KeyMap[AKEYCODE_W] = IRR_KEY_W; + KeyMap[AKEYCODE_X] = IRR_KEY_X; + KeyMap[AKEYCODE_Y] = IRR_KEY_Y; + KeyMap[AKEYCODE_Z] = IRR_KEY_Z; + KeyMap[AKEYCODE_COMMA] = IRR_KEY_COMMA; + KeyMap[AKEYCODE_PERIOD] = IRR_KEY_PERIOD; + KeyMap[AKEYCODE_ALT_LEFT] = IRR_KEY_MENU; + KeyMap[AKEYCODE_ALT_RIGHT] = IRR_KEY_MENU; + KeyMap[AKEYCODE_SHIFT_LEFT] = IRR_KEY_LSHIFT; + KeyMap[AKEYCODE_SHIFT_RIGHT] = IRR_KEY_RSHIFT; + KeyMap[AKEYCODE_TAB] = IRR_KEY_TAB; + KeyMap[AKEYCODE_SPACE] = IRR_KEY_SPACE; + KeyMap[AKEYCODE_SYM] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_EXPLORER] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_ENVELOPE] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_ENTER] = IRR_KEY_RETURN; + KeyMap[AKEYCODE_DEL] = IRR_KEY_BACK; + KeyMap[AKEYCODE_GRAVE] = IRR_KEY_OEM_3; + KeyMap[AKEYCODE_MINUS] = IRR_KEY_MINUS; + KeyMap[AKEYCODE_EQUALS] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_LEFT_BRACKET] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_RIGHT_BRACKET] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BACKSLASH] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_SEMICOLON] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_APOSTROPHE] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_SLASH] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_AT] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_NUM] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_HEADSETHOOK] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_FOCUS] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_PLUS] = IRR_KEY_PLUS; + KeyMap[AKEYCODE_MENU] = IRR_KEY_MENU; + KeyMap[AKEYCODE_NOTIFICATION] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_SEARCH] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_MEDIA_PLAY_PAUSE] = IRR_KEY_MEDIA_PLAY_PAUSE; + KeyMap[AKEYCODE_MEDIA_STOP] = IRR_KEY_MEDIA_STOP; + KeyMap[AKEYCODE_MEDIA_NEXT] = IRR_KEY_MEDIA_NEXT_TRACK; + KeyMap[AKEYCODE_MEDIA_PREVIOUS] = IRR_KEY_MEDIA_PREV_TRACK; + KeyMap[AKEYCODE_MEDIA_REWIND] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_MEDIA_FAST_FORWARD] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_MUTE] = IRR_KEY_VOLUME_MUTE; + KeyMap[AKEYCODE_PAGE_UP] = IRR_KEY_PRIOR; + KeyMap[AKEYCODE_PAGE_DOWN] = IRR_KEY_NEXT; + KeyMap[AKEYCODE_PICTSYMBOLS] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_SWITCH_CHARSET] = IRR_KEY_UNKNOWN; - // following look like controller inputs - KeyMap[AKEYCODE_BUTTON_A] = IRR_KEY_RETURN; - KeyMap[AKEYCODE_BUTTON_B] = IRR_KEY_ESCAPE; - KeyMap[AKEYCODE_BUTTON_C] = IRR_KEY_2; - KeyMap[AKEYCODE_BUTTON_X] = IRR_KEY_3; - KeyMap[AKEYCODE_BUTTON_Y] = IRR_KEY_4; - KeyMap[AKEYCODE_BUTTON_Z] = IRR_KEY_5; - KeyMap[AKEYCODE_BUTTON_L1] = IRR_KEY_6; - KeyMap[AKEYCODE_BUTTON_R1] = IRR_KEY_7; - KeyMap[AKEYCODE_BUTTON_L2] = IRR_KEY_8; - KeyMap[AKEYCODE_BUTTON_R2] = IRR_KEY_9; - KeyMap[AKEYCODE_BUTTON_THUMBL] = IRR_KEY_RETURN; - KeyMap[AKEYCODE_BUTTON_THUMBR] = IRR_KEY_RETURN; - KeyMap[AKEYCODE_BUTTON_START] = IRR_KEY_RETURN; - KeyMap[AKEYCODE_BUTTON_SELECT] = IRR_KEY_ESCAPE; - KeyMap[AKEYCODE_BUTTON_MODE] = IRR_KEY_MENU; + // following look like controller inputs + KeyMap[AKEYCODE_BUTTON_A] = IRR_KEY_RETURN; + KeyMap[AKEYCODE_BUTTON_B] = IRR_KEY_ESCAPE; + KeyMap[AKEYCODE_BUTTON_C] = IRR_KEY_2; + KeyMap[AKEYCODE_BUTTON_X] = IRR_KEY_3; + KeyMap[AKEYCODE_BUTTON_Y] = IRR_KEY_4; + KeyMap[AKEYCODE_BUTTON_Z] = IRR_KEY_5; + KeyMap[AKEYCODE_BUTTON_L1] = IRR_KEY_6; + KeyMap[AKEYCODE_BUTTON_R1] = IRR_KEY_7; + KeyMap[AKEYCODE_BUTTON_L2] = IRR_KEY_8; + KeyMap[AKEYCODE_BUTTON_R2] = IRR_KEY_9; + KeyMap[AKEYCODE_BUTTON_THUMBL] = IRR_KEY_RETURN; + KeyMap[AKEYCODE_BUTTON_THUMBR] = IRR_KEY_RETURN; + KeyMap[AKEYCODE_BUTTON_START] = IRR_KEY_RETURN; + KeyMap[AKEYCODE_BUTTON_SELECT] = IRR_KEY_ESCAPE; + KeyMap[AKEYCODE_BUTTON_MODE] = IRR_KEY_MENU; - KeyMap[AKEYCODE_ESCAPE] = IRR_KEY_ESCAPE; - KeyMap[AKEYCODE_FORWARD_DEL] = IRR_KEY_DELETE; - KeyMap[AKEYCODE_CTRL_LEFT] = IRR_KEY_CONTROL; - KeyMap[AKEYCODE_CTRL_RIGHT] = IRR_KEY_CONTROL; - KeyMap[AKEYCODE_CAPS_LOCK] = IRR_KEY_CAPITAL; - KeyMap[AKEYCODE_SCROLL_LOCK] = IRR_KEY_SCROLL; - KeyMap[AKEYCODE_META_LEFT] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_META_RIGHT] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_FUNCTION] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_SYSRQ] = IRR_KEY_SNAPSHOT; - KeyMap[AKEYCODE_BREAK] = IRR_KEY_PAUSE; - KeyMap[AKEYCODE_MOVE_HOME] = IRR_KEY_HOME; - KeyMap[AKEYCODE_MOVE_END] = IRR_KEY_END; - KeyMap[AKEYCODE_INSERT] = IRR_KEY_INSERT; - KeyMap[AKEYCODE_FORWARD] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_MEDIA_PLAY] = IRR_KEY_PLAY; - KeyMap[AKEYCODE_MEDIA_PAUSE] = IRR_KEY_MEDIA_PLAY_PAUSE; - KeyMap[AKEYCODE_MEDIA_CLOSE] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_MEDIA_EJECT] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_MEDIA_RECORD] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_F1] = IRR_KEY_F1; - KeyMap[AKEYCODE_F2] = IRR_KEY_F2; - KeyMap[AKEYCODE_F3] = IRR_KEY_F3; - KeyMap[AKEYCODE_F4] = IRR_KEY_F4; - KeyMap[AKEYCODE_F5] = IRR_KEY_F5; - KeyMap[AKEYCODE_F6] = IRR_KEY_F6; - KeyMap[AKEYCODE_F7] = IRR_KEY_F7; - KeyMap[AKEYCODE_F8] = IRR_KEY_F8; - KeyMap[AKEYCODE_F9] = IRR_KEY_F9; - KeyMap[AKEYCODE_F10] = IRR_KEY_F10; - KeyMap[AKEYCODE_F11] = IRR_KEY_F11; - KeyMap[AKEYCODE_F12] = IRR_KEY_F12; - KeyMap[AKEYCODE_NUM_LOCK] = IRR_KEY_NUMLOCK; - KeyMap[AKEYCODE_NUMPAD_0] = IRR_KEY_NUMPAD0; - KeyMap[AKEYCODE_NUMPAD_1] = IRR_KEY_NUMPAD1; - KeyMap[AKEYCODE_NUMPAD_2] = IRR_KEY_NUMPAD2; - KeyMap[AKEYCODE_NUMPAD_3] = IRR_KEY_NUMPAD3; - KeyMap[AKEYCODE_NUMPAD_4] = IRR_KEY_NUMPAD4; - KeyMap[AKEYCODE_NUMPAD_5] = IRR_KEY_NUMPAD5; - KeyMap[AKEYCODE_NUMPAD_6] = IRR_KEY_NUMPAD6; - KeyMap[AKEYCODE_NUMPAD_7] = IRR_KEY_NUMPAD7; - KeyMap[AKEYCODE_NUMPAD_8] = IRR_KEY_NUMPAD8; - KeyMap[AKEYCODE_NUMPAD_9] = IRR_KEY_NUMPAD9; - KeyMap[AKEYCODE_NUMPAD_DIVIDE] = IRR_KEY_DIVIDE; - KeyMap[AKEYCODE_NUMPAD_MULTIPLY] = IRR_KEY_MULTIPLY; - KeyMap[AKEYCODE_NUMPAD_SUBTRACT] = IRR_KEY_SUBTRACT; - KeyMap[AKEYCODE_NUMPAD_ADD] = IRR_KEY_ADD; - KeyMap[AKEYCODE_NUMPAD_DOT] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_NUMPAD_COMMA] = IRR_KEY_COMMA; - KeyMap[AKEYCODE_NUMPAD_ENTER] = IRR_KEY_RETURN; - KeyMap[AKEYCODE_NUMPAD_EQUALS] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_NUMPAD_LEFT_PAREN] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_NUMPAD_RIGHT_PAREN] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_VOLUME_MUTE] = IRR_KEY_VOLUME_MUTE; - KeyMap[AKEYCODE_INFO] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_CHANNEL_UP] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_CHANNEL_DOWN] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_ZOOM_IN] = IRR_KEY_ZOOM; - KeyMap[AKEYCODE_ZOOM_OUT] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_TV] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_WINDOW] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_GUIDE] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_DVR] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BOOKMARK] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_CAPTIONS] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_SETTINGS] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_TV_POWER] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_TV_INPUT] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_STB_POWER] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_STB_INPUT] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_AVR_POWER] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_AVR_INPUT] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_PROG_RED] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_PROG_GREEN] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_PROG_YELLOW] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_PROG_BLUE] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_APP_SWITCH] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BUTTON_1] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BUTTON_2] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BUTTON_3] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BUTTON_4] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BUTTON_5] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BUTTON_6] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BUTTON_7] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BUTTON_8] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BUTTON_9] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BUTTON_10] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BUTTON_11] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BUTTON_12] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BUTTON_13] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BUTTON_14] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BUTTON_15] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BUTTON_16] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_LANGUAGE_SWITCH] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_MANNER_MODE] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_3D_MODE] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_CONTACTS] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_CALENDAR] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_MUSIC] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_CALCULATOR] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_ZENKAKU_HANKAKU] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_EISU] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_MUHENKAN] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_HENKAN] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_KATAKANA_HIRAGANA] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_YEN] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_RO] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_KANA] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_ASSIST] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BRIGHTNESS_DOWN] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_BRIGHTNESS_UP] = IRR_KEY_UNKNOWN; - KeyMap[AKEYCODE_MEDIA_AUDIO_TRACK] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_ESCAPE] = IRR_KEY_ESCAPE; + KeyMap[AKEYCODE_FORWARD_DEL] = IRR_KEY_DELETE; + KeyMap[AKEYCODE_CTRL_LEFT] = IRR_KEY_CONTROL; + KeyMap[AKEYCODE_CTRL_RIGHT] = IRR_KEY_CONTROL; + KeyMap[AKEYCODE_CAPS_LOCK] = IRR_KEY_CAPITAL; + KeyMap[AKEYCODE_SCROLL_LOCK] = IRR_KEY_SCROLL; + KeyMap[AKEYCODE_META_LEFT] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_META_RIGHT] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_FUNCTION] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_SYSRQ] = IRR_KEY_SNAPSHOT; + KeyMap[AKEYCODE_BREAK] = IRR_KEY_PAUSE; + KeyMap[AKEYCODE_MOVE_HOME] = IRR_KEY_HOME; + KeyMap[AKEYCODE_MOVE_END] = IRR_KEY_END; + KeyMap[AKEYCODE_INSERT] = IRR_KEY_INSERT; + KeyMap[AKEYCODE_FORWARD] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_MEDIA_PLAY] = IRR_KEY_PLAY; + KeyMap[AKEYCODE_MEDIA_PAUSE] = IRR_KEY_MEDIA_PLAY_PAUSE; + KeyMap[AKEYCODE_MEDIA_CLOSE] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_MEDIA_EJECT] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_MEDIA_RECORD] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_F1] = IRR_KEY_F1; + KeyMap[AKEYCODE_F2] = IRR_KEY_F2; + KeyMap[AKEYCODE_F3] = IRR_KEY_F3; + KeyMap[AKEYCODE_F4] = IRR_KEY_F4; + KeyMap[AKEYCODE_F5] = IRR_KEY_F5; + KeyMap[AKEYCODE_F6] = IRR_KEY_F6; + KeyMap[AKEYCODE_F7] = IRR_KEY_F7; + KeyMap[AKEYCODE_F8] = IRR_KEY_F8; + KeyMap[AKEYCODE_F9] = IRR_KEY_F9; + KeyMap[AKEYCODE_F10] = IRR_KEY_F10; + KeyMap[AKEYCODE_F11] = IRR_KEY_F11; + KeyMap[AKEYCODE_F12] = IRR_KEY_F12; + KeyMap[AKEYCODE_NUM_LOCK] = IRR_KEY_NUMLOCK; + KeyMap[AKEYCODE_NUMPAD_0] = IRR_KEY_NUMPAD0; + KeyMap[AKEYCODE_NUMPAD_1] = IRR_KEY_NUMPAD1; + KeyMap[AKEYCODE_NUMPAD_2] = IRR_KEY_NUMPAD2; + KeyMap[AKEYCODE_NUMPAD_3] = IRR_KEY_NUMPAD3; + KeyMap[AKEYCODE_NUMPAD_4] = IRR_KEY_NUMPAD4; + KeyMap[AKEYCODE_NUMPAD_5] = IRR_KEY_NUMPAD5; + KeyMap[AKEYCODE_NUMPAD_6] = IRR_KEY_NUMPAD6; + KeyMap[AKEYCODE_NUMPAD_7] = IRR_KEY_NUMPAD7; + KeyMap[AKEYCODE_NUMPAD_8] = IRR_KEY_NUMPAD8; + KeyMap[AKEYCODE_NUMPAD_9] = IRR_KEY_NUMPAD9; + KeyMap[AKEYCODE_NUMPAD_DIVIDE] = IRR_KEY_DIVIDE; + KeyMap[AKEYCODE_NUMPAD_MULTIPLY] = IRR_KEY_MULTIPLY; + KeyMap[AKEYCODE_NUMPAD_SUBTRACT] = IRR_KEY_SUBTRACT; + KeyMap[AKEYCODE_NUMPAD_ADD] = IRR_KEY_ADD; + KeyMap[AKEYCODE_NUMPAD_DOT] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_NUMPAD_COMMA] = IRR_KEY_COMMA; + KeyMap[AKEYCODE_NUMPAD_ENTER] = IRR_KEY_RETURN; + KeyMap[AKEYCODE_NUMPAD_EQUALS] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_NUMPAD_LEFT_PAREN] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_NUMPAD_RIGHT_PAREN] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_VOLUME_MUTE] = IRR_KEY_VOLUME_MUTE; + KeyMap[AKEYCODE_INFO] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_CHANNEL_UP] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_CHANNEL_DOWN] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_ZOOM_IN] = IRR_KEY_ZOOM; + KeyMap[AKEYCODE_ZOOM_OUT] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_TV] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_WINDOW] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_GUIDE] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_DVR] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BOOKMARK] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_CAPTIONS] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_SETTINGS] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_TV_POWER] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_TV_INPUT] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_STB_POWER] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_STB_INPUT] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_AVR_POWER] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_AVR_INPUT] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_PROG_RED] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_PROG_GREEN] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_PROG_YELLOW] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_PROG_BLUE] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_APP_SWITCH] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BUTTON_1] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BUTTON_2] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BUTTON_3] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BUTTON_4] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BUTTON_5] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BUTTON_6] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BUTTON_7] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BUTTON_8] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BUTTON_9] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BUTTON_10] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BUTTON_11] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BUTTON_12] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BUTTON_13] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BUTTON_14] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BUTTON_15] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BUTTON_16] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_LANGUAGE_SWITCH] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_MANNER_MODE] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_3D_MODE] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_CONTACTS] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_CALENDAR] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_MUSIC] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_CALCULATOR] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_ZENKAKU_HANKAKU] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_EISU] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_MUHENKAN] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_HENKAN] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_KATAKANA_HIRAGANA] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_YEN] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_RO] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_KANA] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_ASSIST] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BRIGHTNESS_DOWN] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_BRIGHTNESS_UP] = IRR_KEY_UNKNOWN; + KeyMap[AKEYCODE_MEDIA_AUDIO_TRACK] = IRR_KEY_UNKNOWN; } void CIrrDeviceAndroid::getKeyChar(SEvent& event) { - // Handle ASCII chars + // Handle ASCII chars - event.KeyInput.Char = 0; + event.KeyInput.Char = 0; - // A-Z - if (event.KeyInput.SystemKeyCode > 28 && event.KeyInput.SystemKeyCode < 55) - { - if (event.KeyInput.Shift) - { - event.KeyInput.Char = event.KeyInput.SystemKeyCode + 36; - } - else - { - event.KeyInput.Char = event.KeyInput.SystemKeyCode + 68; - } - } + // A-Z + if (event.KeyInput.SystemKeyCode > 28 && event.KeyInput.SystemKeyCode < 55) + { + if (event.KeyInput.Shift) + { + event.KeyInput.Char = event.KeyInput.SystemKeyCode + 36; + } + else + { + event.KeyInput.Char = event.KeyInput.SystemKeyCode + 68; + } + } - // 0-9 - else if (event.KeyInput.SystemKeyCode > 6 && event.KeyInput.SystemKeyCode < 17) - { - event.KeyInput.Char = event.KeyInput.SystemKeyCode + 41; - } + // 0-9 + else if (event.KeyInput.SystemKeyCode > 6 && event.KeyInput.SystemKeyCode < 17) + { + event.KeyInput.Char = event.KeyInput.SystemKeyCode + 41; + } - else if (event.KeyInput.SystemKeyCode == AKEYCODE_BACK) - { - event.KeyInput.Char = 8; - } - else if (event.KeyInput.SystemKeyCode == AKEYCODE_DEL) - { - event.KeyInput.Char = 8; - } - else if (event.KeyInput.SystemKeyCode == AKEYCODE_TAB) - { - event.KeyInput.Char = 9; - } - else if (event.KeyInput.SystemKeyCode == AKEYCODE_ENTER) - { - event.KeyInput.Char = 13; - } - else if (event.KeyInput.SystemKeyCode == AKEYCODE_SPACE) - { - event.KeyInput.Char = 32; - } - else if (event.KeyInput.SystemKeyCode == AKEYCODE_COMMA) - { - event.KeyInput.Char = 44; - } - else if (event.KeyInput.SystemKeyCode == AKEYCODE_PERIOD) - { - event.KeyInput.Char = 46; - } + else if (event.KeyInput.SystemKeyCode == AKEYCODE_BACK) + { + event.KeyInput.Char = 8; + } + else if (event.KeyInput.SystemKeyCode == AKEYCODE_DEL) + { + event.KeyInput.Char = 8; + } + else if (event.KeyInput.SystemKeyCode == AKEYCODE_TAB) + { + event.KeyInput.Char = 9; + } + else if (event.KeyInput.SystemKeyCode == AKEYCODE_ENTER) + { + event.KeyInput.Char = 13; + } + else if (event.KeyInput.SystemKeyCode == AKEYCODE_SPACE) + { + event.KeyInput.Char = 32; + } + else if (event.KeyInput.SystemKeyCode == AKEYCODE_COMMA) + { + event.KeyInput.Char = 44; + } + else if (event.KeyInput.SystemKeyCode == AKEYCODE_PERIOD) + { + event.KeyInput.Char = 46; + } } int CIrrDeviceAndroid::getRotation() { - JavaVMAttachArgs args; - args.version = JNI_VERSION_1_6; - args.name = "NativeThread"; - args.group = NULL; - JNIEnv* env; + JavaVMAttachArgs args; + args.version = JNI_VERSION_1_6; + args.name = "NativeThread"; + args.group = NULL; + JNIEnv* env; - if (Android->activity->vm->AttachCurrentThread(&env, &args) != JNI_OK) - { - os::Printer::log("Cannot find rotation.", ELL_DEBUG); - return 0; - } + if (Android->activity->vm->AttachCurrentThread(&env, &args) != JNI_OK) + { + os::Printer::log("Cannot find rotation.", ELL_DEBUG); + return 0; + } - jobject activity_obj = Android->activity->clazz; + jobject activity_obj = Android->activity->clazz; - jclass activity = env->GetObjectClass(activity_obj); - jclass context = env->FindClass("android/content/Context"); - jclass window_manager = env->FindClass("android/view/WindowManager"); - jclass display = env->FindClass("android/view/Display"); + jclass activity = env->GetObjectClass(activity_obj); + jclass context = env->FindClass("android/content/Context"); + jclass window_manager = env->FindClass("android/view/WindowManager"); + jclass display = env->FindClass("android/view/Display"); - jmethodID get_system_service = env->GetMethodID(activity, "getSystemService", - "(Ljava/lang/String;)Ljava/lang/Object;"); - jmethodID get_default_display = env->GetMethodID(window_manager, - "getDefaultDisplay", - "()Landroid/view/Display;"); - jmethodID get_rotation = env->GetMethodID(display, "getRotation", "()I"); + jmethodID get_system_service = env->GetMethodID(activity, "getSystemService", + "(Ljava/lang/String;)Ljava/lang/Object;"); + jmethodID get_default_display = env->GetMethodID(window_manager, + "getDefaultDisplay", + "()Landroid/view/Display;"); + jmethodID get_rotation = env->GetMethodID(display, "getRotation", "()I"); - jfieldID window_service = env->GetStaticFieldID(context, "WINDOW_SERVICE", - "Ljava/lang/String;"); + jfieldID window_service = env->GetStaticFieldID(context, "WINDOW_SERVICE", + "Ljava/lang/String;"); - jobject window_service_obj = env->GetStaticObjectField(context, window_service); + jobject window_service_obj = env->GetStaticObjectField(context, window_service); - jobject window_manager_obj = env->CallObjectMethod(activity_obj, get_system_service, - window_service_obj); + jobject window_manager_obj = env->CallObjectMethod(activity_obj, get_system_service, + window_service_obj); - jobject display_obj = env->CallObjectMethod(window_manager_obj, get_default_display); - - int rotation = env->CallIntMethod(display_obj, get_rotation); - - env->DeleteLocalRef(activity); - env->DeleteLocalRef(context); - env->DeleteLocalRef(window_manager); - env->DeleteLocalRef(display); - - Android->activity->vm->DetachCurrentThread(); - - return rotation; + jobject display_obj = env->CallObjectMethod(window_manager_obj, get_default_display); + + int rotation = env->CallIntMethod(display_obj, get_rotation); + + env->DeleteLocalRef(activity); + env->DeleteLocalRef(context); + env->DeleteLocalRef(window_manager); + env->DeleteLocalRef(display); + + Android->activity->vm->DetachCurrentThread(); + + return rotation; } int CIrrDeviceAndroid::getDefaultRotation() { - int rotation = getRotation(); - - int32_t orientation = AConfiguration_getOrientation(Android->config); - - if (((rotation == 0 || rotation == 2) && - orientation == ACONFIGURATION_ORIENTATION_LAND) || - ((rotation == 1 || rotation == 3) && - orientation == ACONFIGURATION_ORIENTATION_PORT)) - { - return 1; - } - else - { - return 0; - } + int rotation = getRotation(); + + int32_t orientation = AConfiguration_getOrientation(Android->config); + + if (((rotation == 0 || rotation == 2) && + orientation == ACONFIGURATION_ORIENTATION_LAND) || + ((rotation == 1 || rotation == 3) && + orientation == ACONFIGURATION_ORIENTATION_PORT)) + { + return 1; + } + else + { + return 0; + } } bool CIrrDeviceAndroid::activateAccelerometer(float updateInterval) { - if (!isAccelerometerAvailable()) - return false; + if (!isAccelerometerAvailable()) + return false; - ASensorEventQueue_enableSensor(SensorEventQueue, Accelerometer); - ASensorEventQueue_setEventRate(SensorEventQueue, Accelerometer, - (int32_t)(updateInterval*1000.f*1000.f)); // in microseconds + ASensorEventQueue_enableSensor(SensorEventQueue, Accelerometer); + ASensorEventQueue_setEventRate(SensorEventQueue, Accelerometer, + (int32_t)(updateInterval*1000.f*1000.f)); // in microseconds - os::Printer::log("Activated accelerometer", ELL_DEBUG); - return true; + os::Printer::log("Activated accelerometer", ELL_DEBUG); + return true; } bool CIrrDeviceAndroid::deactivateAccelerometer() { - if (!Accelerometer) - return false; + if (!Accelerometer) + return false; - ASensorEventQueue_disableSensor(SensorEventQueue, Accelerometer); - Accelerometer = 0; - os::Printer::log("Deactivated accelerometer", ELL_DEBUG); - return true; + ASensorEventQueue_disableSensor(SensorEventQueue, Accelerometer); + Accelerometer = 0; + os::Printer::log("Deactivated accelerometer", ELL_DEBUG); + return true; } bool CIrrDeviceAndroid::isAccelerometerActive() { - return (Accelerometer != NULL); + return (Accelerometer != NULL); } bool CIrrDeviceAndroid::isAccelerometerAvailable() { - if (!Accelerometer) - { - Accelerometer = ASensorManager_getDefaultSensor(SensorManager, - ASENSOR_TYPE_ACCELEROMETER); - } + if (!Accelerometer) + { + Accelerometer = ASensorManager_getDefaultSensor(SensorManager, + ASENSOR_TYPE_ACCELEROMETER); + } - return (Accelerometer != NULL); + return (Accelerometer != NULL); } bool CIrrDeviceAndroid::activateGyroscope(float updateInterval) { - if (!isGyroscopeAvailable()) - return false; + if (!isGyroscopeAvailable()) + return false; - ASensorEventQueue_enableSensor(SensorEventQueue, Gyroscope); - ASensorEventQueue_setEventRate(SensorEventQueue, Gyroscope, - (int32_t)(updateInterval*1000.f*1000.f)); // in microseconds + ASensorEventQueue_enableSensor(SensorEventQueue, Gyroscope); + ASensorEventQueue_setEventRate(SensorEventQueue, Gyroscope, + (int32_t)(updateInterval*1000.f*1000.f)); // in microseconds - os::Printer::log("Activated gyroscope", ELL_DEBUG); - return true; + os::Printer::log("Activated gyroscope", ELL_DEBUG); + return true; } bool CIrrDeviceAndroid::deactivateGyroscope() { - if (!Gyroscope) - return false; + if (!Gyroscope) + return false; - ASensorEventQueue_disableSensor(SensorEventQueue, Gyroscope); - Gyroscope = 0; - os::Printer::log("Deactivated gyroscope", ELL_DEBUG); - return true; + ASensorEventQueue_disableSensor(SensorEventQueue, Gyroscope); + Gyroscope = 0; + os::Printer::log("Deactivated gyroscope", ELL_DEBUG); + return true; } bool CIrrDeviceAndroid::isGyroscopeActive() { - return (Gyroscope != NULL); + return (Gyroscope != NULL); } bool CIrrDeviceAndroid::isGyroscopeAvailable() { - if (!Gyroscope) - { - Gyroscope = ASensorManager_getDefaultSensor(SensorManager, - ASENSOR_TYPE_GYROSCOPE); - } + if (!Gyroscope) + { + Gyroscope = ASensorManager_getDefaultSensor(SensorManager, + ASENSOR_TYPE_GYROSCOPE); + } - return (Gyroscope != NULL); + return (Gyroscope != NULL); } diff --git a/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.h b/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.h index d0c869769..9533c11a3 100644 --- a/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.h +++ b/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.h @@ -24,126 +24,126 @@ namespace irr { - class CIrrDeviceAndroid : public CIrrDeviceStub, video::IImagePresenter - { - public: - //! constructor - CIrrDeviceAndroid(const SIrrlichtCreationParameters& param); + class CIrrDeviceAndroid : public CIrrDeviceStub, video::IImagePresenter + { + public: + //! constructor + CIrrDeviceAndroid(const SIrrlichtCreationParameters& param); - //! destructor - virtual ~CIrrDeviceAndroid(); + //! destructor + virtual ~CIrrDeviceAndroid(); - virtual bool run(); - virtual void yield(); - virtual void sleep(u32 timeMs, bool pauseTimer=false); - virtual void setWindowCaption(const wchar_t* text); - virtual void setWindowClass(const char* text) {} - virtual bool present(video::IImage* surface, void* windowId, core::rect* srcClip); - virtual bool isWindowActive() const; - virtual bool isWindowFocused() const; - virtual bool isWindowMinimized() const; - virtual void closeDevice(); - virtual void setResizable( bool resize=false ); - virtual void minimizeWindow(); - virtual void maximizeWindow(); - virtual void restoreWindow(); - virtual bool moveWindow(int x, int y); - virtual bool getWindowPosition(int* x, int* y); - virtual E_DEVICE_TYPE getType() const; - virtual bool activateAccelerometer(float updateInterval); - virtual bool deactivateAccelerometer(); - virtual bool isAccelerometerActive(); - virtual bool isAccelerometerAvailable(); - virtual bool activateGyroscope(float updateInterval); - virtual bool deactivateGyroscope(); - virtual bool isGyroscopeActive(); - virtual bool isGyroscopeAvailable(); - - class CCursorControl : public gui::ICursorControl - { - public: + virtual bool run(); + virtual void yield(); + virtual void sleep(u32 timeMs, bool pauseTimer=false); + virtual void setWindowCaption(const wchar_t* text); + virtual void setWindowClass(const char* text) {} + virtual bool present(video::IImage* surface, void* windowId, core::rect* srcClip); + virtual bool isWindowActive() const; + virtual bool isWindowFocused() const; + virtual bool isWindowMinimized() const; + virtual void closeDevice(); + virtual void setResizable( bool resize=false ); + virtual void minimizeWindow(); + virtual void maximizeWindow(); + virtual void restoreWindow(); + virtual bool moveWindow(int x, int y); + virtual bool getWindowPosition(int* x, int* y); + virtual E_DEVICE_TYPE getType() const; + virtual bool activateAccelerometer(float updateInterval); + virtual bool deactivateAccelerometer(); + virtual bool isAccelerometerActive(); + virtual bool isAccelerometerAvailable(); + virtual bool activateGyroscope(float updateInterval); + virtual bool deactivateGyroscope(); + virtual bool isGyroscopeActive(); + virtual bool isGyroscopeAvailable(); + + class CCursorControl : public gui::ICursorControl + { + public: - CCursorControl() : CursorPos(core::position2d(0, 0)) {} - virtual void setVisible(bool visible) {} - virtual bool isVisible() const {return false;} - virtual void setPosition(const core::position2d &pos) - { - setPosition(pos.X, pos.Y); - } - virtual void setPosition(f32 x, f32 y) - { - CursorPos.X = x; - CursorPos.Y = y; - } - virtual void setPosition(const core::position2d &pos) - { - setPosition(pos.X, pos.Y); - } - virtual void setPosition(s32 x, s32 y) - { - CursorPos.X = x; - CursorPos.Y = y; - } - virtual const core::position2d& getPosition() - { - return CursorPos; - } - virtual core::position2d getRelativePosition() - { - return core::position2d(0, 0); - } - virtual void setReferenceRect(core::rect* rect=0) {} - private: - core::position2d CursorPos; - }; - - static void onCreate(); + CCursorControl() : CursorPos(core::position2d(0, 0)) {} + virtual void setVisible(bool visible) {} + virtual bool isVisible() const {return false;} + virtual void setPosition(const core::position2d &pos) + { + setPosition(pos.X, pos.Y); + } + virtual void setPosition(f32 x, f32 y) + { + CursorPos.X = x; + CursorPos.Y = y; + } + virtual void setPosition(const core::position2d &pos) + { + setPosition(pos.X, pos.Y); + } + virtual void setPosition(s32 x, s32 y) + { + CursorPos.X = x; + CursorPos.Y = y; + } + virtual const core::position2d& getPosition() + { + return CursorPos; + } + virtual core::position2d getRelativePosition() + { + return core::position2d(0, 0); + } + virtual void setReferenceRect(core::rect* rect=0) {} + private: + core::position2d CursorPos; + }; + + static void onCreate(); - private: - android_app* Android; - ASensorManager* SensorManager; - ASensorEventQueue* SensorEventQueue; - const ASensor* Accelerometer; - const ASensor* Gyroscope; + private: + android_app* Android; + ASensorManager* SensorManager; + ASensorEventQueue* SensorEventQueue; + const ASensor* Accelerometer; + const ASensor* Gyroscope; - static bool IsPaused; - static bool IsFocused; - static bool IsStarted; - - struct TouchEventData - { - int x; - int y; - ETOUCH_INPUT_EVENT event; - - TouchEventData() : x(0), y(0), event(ETIE_COUNT) {}; - }; - - TouchEventData TouchEventsData[32]; - bool IsMousePressed; - float GamepadAxisX; - float GamepadAxisY; + static bool IsPaused; + static bool IsFocused; + static bool IsStarted; + + struct TouchEventData + { + int x; + int y; + ETOUCH_INPUT_EVENT event; + + TouchEventData() : x(0), y(0), event(ETIE_COUNT) {}; + }; + + TouchEventData TouchEventsData[32]; + bool IsMousePressed; + float GamepadAxisX; + float GamepadAxisY; - video::SExposedVideoData ExposedVideoData; + video::SExposedVideoData ExposedVideoData; - std::map KeyMap; - - void printConfig(); - void createDriver(); - void createKeyMap(); - void createVideoModeList(); - void getKeyChar(SEvent& event); - int getRotation(); - int getDefaultRotation(); - video::SExposedVideoData& getExposedVideoData(); - - static void handleAndroidCommand(android_app* app, int32_t cmd); - static s32 handleInput(android_app* app, AInputEvent* event); + std::map KeyMap; + + void printConfig(); + void createDriver(); + void createKeyMap(); + void createVideoModeList(); + void getKeyChar(SEvent& event); + int getRotation(); + int getDefaultRotation(); + video::SExposedVideoData& getExposedVideoData(); + + static void handleAndroidCommand(android_app* app, int32_t cmd); + static s32 handleInput(android_app* app, AInputEvent* event); - s32 handleTouch(AInputEvent* androidEvent); - s32 handleKeyboard(AInputEvent* androidEvent); - s32 handleGamepad(AInputEvent* androidEvent); - }; + s32 handleTouch(AInputEvent* androidEvent); + s32 handleKeyboard(AInputEvent* androidEvent); + s32 handleGamepad(AInputEvent* androidEvent); + }; } // end namespace irr From 7db4ef8056d883ba0027df948d2c4e6d31a9f5f6 Mon Sep 17 00:00:00 2001 From: samuncle Date: Tue, 27 Feb 2018 23:38:28 +0100 Subject: [PATCH 08/17] Add a shader to use the day/night cycle for lamps, etc --- data/shaders/sp_dynamic_night_bloom.frag | 56 ++++++++++++++++++++++++ data/shaders/sps_9_dynamicNightBloom.xml | 20 +++++++++ 2 files changed, 76 insertions(+) create mode 100644 data/shaders/sp_dynamic_night_bloom.frag create mode 100644 data/shaders/sps_9_dynamicNightBloom.xml diff --git a/data/shaders/sp_dynamic_night_bloom.frag b/data/shaders/sp_dynamic_night_bloom.frag new file mode 100644 index 000000000..27b006fc1 --- /dev/null +++ b/data/shaders/sp_dynamic_night_bloom.frag @@ -0,0 +1,56 @@ +in vec3 bitangent; +in vec4 color; +in float hue_change; +in vec3 normal; +in vec3 tangent; +in vec2 uv; +uniform int is_during_day; + +layout(location = 0) out vec4 o_diffuse_color; +layout(location = 1) out vec4 o_normal_color; + +#stk_include "utils/encode_normal.frag" +#stk_include "utils/rgb_conversion.frag" +#stk_include "utils/sp_texture_sampling.frag" + +void main() +{ + vec4 col = sampleTextureLayer0(uv); + if (hue_change > 0.0) + { + float mask = col.a; + vec3 old_hsv = rgbToHsv(col.rgb); + float mask_step = step(mask, 0.5); +#if !defined(Advanced_Lighting_Enabled) + // For similar color + float saturation = mask * 1.825; // 2.5 * 0.5 ^ (1. / 2.2) +#else + float saturation = mask * 2.5; +#endif + vec2 new_xy = mix(vec2(old_hsv.x, old_hsv.y), vec2(hue_change, + max(old_hsv.y, saturation)), vec2(mask_step, mask_step)); + vec3 new_color = hsvToRgb(vec3(new_xy.x, new_xy.y, old_hsv.z)); + col = vec4(new_color.r, new_color.g, new_color.b, 1.0); + } + + vec3 final_color = col.xyz * color.xyz; + +#if defined(Advanced_Lighting_Enabled) + vec4 layer_2 = sampleTextureLayer2(uv); + vec4 layer_3 = sampleTextureLayer3(uv); + o_diffuse_color = vec4(final_color, layer_2.z * (1.0f - float(is_during_day))); + + vec3 tangent_space_normal = 2.0 * layer_3.xyz - 1.0; + vec3 frag_tangent = normalize(tangent); + vec3 frag_bitangent = normalize(bitangent); + vec3 frag_normal = normalize(normal); + mat3 t_b_n = mat3(frag_tangent, frag_bitangent, frag_normal); + + vec3 world_normal = t_b_n * tangent_space_normal; + + o_normal_color.xy = 0.5 * EncodeNormal(normalize(world_normal)) + 0.5; + o_normal_color.zw = layer_2.xy; +#else + o_diffuse_color = vec4(final_color, 1.0); +#endif +} diff --git a/data/shaders/sps_9_dynamicNightBloom.xml b/data/shaders/sps_9_dynamicNightBloom.xml new file mode 100644 index 000000000..fa38286ba --- /dev/null +++ b/data/shaders/sps_9_dynamicNightBloom.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + From 0ee00ad1e549587d07bc9f25443ab8131c10c6e0 Mon Sep 17 00:00:00 2001 From: Deve Date: Wed, 28 Feb 2018 21:40:02 +0100 Subject: [PATCH 09/17] Make accelerometer values relative to device orientation --- .../source/Irrlicht/CIrrDeviceAndroid.cpp | 25 ++++++++++++++++--- .../source/Irrlicht/CIrrDeviceAndroid.h | 1 + 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.cpp b/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.cpp index 81b7f041c..4e0c8d6d3 100644 --- a/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.cpp +++ b/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.cpp @@ -50,7 +50,8 @@ CIrrDeviceAndroid::CIrrDeviceAndroid(const SIrrlichtCreationParameters& param) Gyroscope(0), IsMousePressed(false), GamepadAxisX(0), - GamepadAxisY(0) + GamepadAxisY(0), + DefaultOrientation(0) { #ifdef _DEBUG setDebugName("CIrrDeviceAndroid"); @@ -63,6 +64,8 @@ CIrrDeviceAndroid::CIrrDeviceAndroid(const SIrrlichtCreationParameters& param) Android->onAppCmd = handleAndroidCommand; Android->onInputEvent = handleInput; + DefaultOrientation = getDefaultRotation(); + printConfig(); createKeyMap(); @@ -250,9 +253,25 @@ bool CIrrDeviceAndroid::run() case ASENSOR_TYPE_ACCELEROMETER: SEvent accEvent; accEvent.EventType = EET_ACCELEROMETER_EVENT; - accEvent.AccelerometerEvent.X = event.acceleration.x; - accEvent.AccelerometerEvent.Y = event.acceleration.y; + + if (DefaultOrientation == 0) + { + accEvent.AccelerometerEvent.X = event.acceleration.x; + accEvent.AccelerometerEvent.Y = event.acceleration.y; + } + else + { + accEvent.AccelerometerEvent.X = event.acceleration.y; + accEvent.AccelerometerEvent.Y = -event.acceleration.x; + } accEvent.AccelerometerEvent.Z = event.acceleration.z; + + if (accEvent.AccelerometerEvent.X < 0) + { + accEvent.AccelerometerEvent.X *= -1; + accEvent.AccelerometerEvent.Y *= -1; + accEvent.AccelerometerEvent.Z *= -1; + } postEventFromUser(accEvent); break; diff --git a/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.h b/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.h index 9533c11a3..97ce5da71 100644 --- a/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.h +++ b/lib/irrlicht/source/Irrlicht/CIrrDeviceAndroid.h @@ -123,6 +123,7 @@ namespace irr bool IsMousePressed; float GamepadAxisX; float GamepadAxisY; + int DefaultOrientation; video::SExposedVideoData ExposedVideoData; From a00c1cadc8869b7d2879f26f88b2031e86f110f1 Mon Sep 17 00:00:00 2001 From: Deve Date: Wed, 28 Feb 2018 21:59:08 +0100 Subject: [PATCH 10/17] Simplify accelerometer selection in settings --- data/gui/multitouch_settings.stkgui | 2 +- src/input/input_manager.cpp | 14 +++---------- .../dialogs/multitouch_settings_dialog.cpp | 20 +++++-------------- 3 files changed, 9 insertions(+), 27 deletions(-) diff --git a/data/gui/multitouch_settings.stkgui b/data/gui/multitouch_settings.stkgui index 9704560a9..5c32cc738 100644 --- a/data/gui/multitouch_settings.stkgui +++ b/data/gui/multitouch_settings.stkgui @@ -35,7 +35,7 @@