Align sensors and implement gravity sensor for Android
This commit is contained in:
parent
19b1ff0fc5
commit
6205eb40e7
8 changed files with 39 additions and 14 deletions
|
@ -156,17 +156,6 @@ void MobileVRInterface::set_position_from_sensors() {
|
||||||
has_gyro = true;
|
has_gyro = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef ANDROID_ENABLED
|
|
||||||
///@TODO needs testing, i don't have a gyro, potentially can be removed depending on what comes out of issue #8101
|
|
||||||
// On Android x and z axis seem inverted
|
|
||||||
gyro.x = -gyro.x;
|
|
||||||
gyro.z = -gyro.z;
|
|
||||||
grav.x = -grav.x;
|
|
||||||
grav.z = -grav.z;
|
|
||||||
magneto.x = -magneto.x;
|
|
||||||
magneto.z = -magneto.z;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (has_gyro) {
|
if (has_gyro) {
|
||||||
// start with applying our gyro (do NOT smooth our gyro!)
|
// start with applying our gyro (do NOT smooth our gyro!)
|
||||||
Basis rotate;
|
Basis rotate;
|
||||||
|
|
|
@ -669,6 +669,14 @@ static void engine_handle_cmd(struct android_app *app, int32_t cmd) {
|
||||||
ASensorEventQueue_setEventRate(engine->sensorEventQueue,
|
ASensorEventQueue_setEventRate(engine->sensorEventQueue,
|
||||||
engine->accelerometerSensor, (1000L / 60) * 1000);
|
engine->accelerometerSensor, (1000L / 60) * 1000);
|
||||||
}
|
}
|
||||||
|
// start monitoring gravity
|
||||||
|
if (engine->gravitySensor != NULL) {
|
||||||
|
ASensorEventQueue_enableSensor(engine->sensorEventQueue,
|
||||||
|
engine->gravitySensor);
|
||||||
|
// We'd like to get 60 events per second (in us).
|
||||||
|
ASensorEventQueue_setEventRate(engine->sensorEventQueue,
|
||||||
|
engine->gravitySensor, (1000L / 60) * 1000);
|
||||||
|
}
|
||||||
// Also start monitoring the magnetometer.
|
// Also start monitoring the magnetometer.
|
||||||
if (engine->magnetometerSensor != NULL) {
|
if (engine->magnetometerSensor != NULL) {
|
||||||
ASensorEventQueue_enableSensor(engine->sensorEventQueue,
|
ASensorEventQueue_enableSensor(engine->sensorEventQueue,
|
||||||
|
@ -694,6 +702,10 @@ static void engine_handle_cmd(struct android_app *app, int32_t cmd) {
|
||||||
ASensorEventQueue_disableSensor(engine->sensorEventQueue,
|
ASensorEventQueue_disableSensor(engine->sensorEventQueue,
|
||||||
engine->accelerometerSensor);
|
engine->accelerometerSensor);
|
||||||
}
|
}
|
||||||
|
if (engine->gravitySensor != NULL) {
|
||||||
|
ASensorEventQueue_disableSensor(engine->sensorEventQueue,
|
||||||
|
engine->gravitySensor);
|
||||||
|
}
|
||||||
if (engine->magnetometerSensor != NULL) {
|
if (engine->magnetometerSensor != NULL) {
|
||||||
ASensorEventQueue_disableSensor(engine->sensorEventQueue,
|
ASensorEventQueue_disableSensor(engine->sensorEventQueue,
|
||||||
engine->magnetometerSensor);
|
engine->magnetometerSensor);
|
||||||
|
@ -729,6 +741,8 @@ void android_main(struct android_app *app) {
|
||||||
engine.sensorManager = ASensorManager_getInstance();
|
engine.sensorManager = ASensorManager_getInstance();
|
||||||
engine.accelerometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager,
|
engine.accelerometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager,
|
||||||
ASENSOR_TYPE_ACCELEROMETER);
|
ASENSOR_TYPE_ACCELEROMETER);
|
||||||
|
engine.gravitySensor = ASensorManager_getDefaultSensor(engine.sensorManager,
|
||||||
|
ASENSOR_TYPE_GRAVITY);
|
||||||
engine.magnetometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager,
|
engine.magnetometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager,
|
||||||
ASENSOR_TYPE_MAGNETIC_FIELD);
|
ASENSOR_TYPE_MAGNETIC_FIELD);
|
||||||
engine.gyroscopeSensor = ASensorManager_getDefaultSensor(engine.sensorManager,
|
engine.gyroscopeSensor = ASensorManager_getDefaultSensor(engine.sensorManager,
|
||||||
|
|
|
@ -219,6 +219,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||||
|
|
||||||
private SensorManager mSensorManager;
|
private SensorManager mSensorManager;
|
||||||
private Sensor mAccelerometer;
|
private Sensor mAccelerometer;
|
||||||
|
private Sensor mGravity;
|
||||||
private Sensor mMagnetometer;
|
private Sensor mMagnetometer;
|
||||||
private Sensor mGyroscope;
|
private Sensor mGyroscope;
|
||||||
|
|
||||||
|
@ -435,6 +436,8 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||||
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
|
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
|
||||||
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
|
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
|
||||||
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_GAME);
|
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_GAME);
|
||||||
|
mGravity = mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
|
||||||
|
mSensorManager.registerListener(this, mGravity, SensorManager.SENSOR_DELAY_GAME);
|
||||||
mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
|
mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
|
||||||
mSensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_GAME);
|
mSensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_GAME);
|
||||||
mGyroscope = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
|
mGyroscope = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
|
||||||
|
@ -667,6 +670,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_GAME);
|
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_GAME);
|
||||||
|
mSensorManager.registerListener(this, mGravity, SensorManager.SENSOR_DELAY_GAME);
|
||||||
mSensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_GAME);
|
mSensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_GAME);
|
||||||
mSensorManager.registerListener(this, mGyroscope, SensorManager.SENSOR_DELAY_GAME);
|
mSensorManager.registerListener(this, mGyroscope, SensorManager.SENSOR_DELAY_GAME);
|
||||||
|
|
||||||
|
@ -734,13 +738,16 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (typeOfSensor == Sensor.TYPE_ACCELEROMETER) {
|
if (typeOfSensor == Sensor.TYPE_ACCELEROMETER) {
|
||||||
GodotLib.accelerometer(x,y,z);
|
GodotLib.accelerometer(-x,y,-z);
|
||||||
|
}
|
||||||
|
if (typeOfSensor == Sensor.TYPE_GRAVITY) {
|
||||||
|
GodotLib.gravity(-x,y,-z);
|
||||||
}
|
}
|
||||||
if (typeOfSensor == Sensor.TYPE_MAGNETIC_FIELD) {
|
if (typeOfSensor == Sensor.TYPE_MAGNETIC_FIELD) {
|
||||||
GodotLib.magnetometer(x,y,z);
|
GodotLib.magnetometer(-x,y,-z);
|
||||||
}
|
}
|
||||||
if (typeOfSensor == Sensor.TYPE_GYROSCOPE) {
|
if (typeOfSensor == Sensor.TYPE_GYROSCOPE) {
|
||||||
GodotLib.gyroscope(x,y,z);
|
GodotLib.gyroscope(x,-y,z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -53,6 +53,7 @@ public class GodotLib {
|
||||||
public static native void step();
|
public static native void step();
|
||||||
public static native void touch(int what,int pointer,int howmany, int[] arr);
|
public static native void touch(int what,int pointer,int howmany, int[] arr);
|
||||||
public static native void accelerometer(float x, float y, float z);
|
public static native void accelerometer(float x, float y, float z);
|
||||||
|
public static native void gravity(float x, float y, float z);
|
||||||
public static native void magnetometer(float x, float y, float z);
|
public static native void magnetometer(float x, float y, float z);
|
||||||
public static native void gyroscope(float x, float y, float z);
|
public static native void gyroscope(float x, float y, float z);
|
||||||
public static native void key(int p_scancode, int p_unicode_char, boolean p_pressed);
|
public static native void key(int p_scancode, int p_unicode_char, boolean p_pressed);
|
||||||
|
|
|
@ -608,6 +608,7 @@ static bool resized = false;
|
||||||
static bool resized_reload = false;
|
static bool resized_reload = false;
|
||||||
static Size2 new_size;
|
static Size2 new_size;
|
||||||
static Vector3 accelerometer;
|
static Vector3 accelerometer;
|
||||||
|
static Vector3 gravity;
|
||||||
static Vector3 magnetometer;
|
static Vector3 magnetometer;
|
||||||
static Vector3 gyroscope;
|
static Vector3 gyroscope;
|
||||||
static HashMap<String, JNISingleton *> jni_singletons;
|
static HashMap<String, JNISingleton *> jni_singletons;
|
||||||
|
@ -1012,6 +1013,8 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv *env, job
|
||||||
|
|
||||||
os_android->process_accelerometer(accelerometer);
|
os_android->process_accelerometer(accelerometer);
|
||||||
|
|
||||||
|
os_android->process_gravity(gravity);
|
||||||
|
|
||||||
os_android->process_magnetometer(magnetometer);
|
os_android->process_magnetometer(magnetometer);
|
||||||
|
|
||||||
os_android->process_gyroscope(gyroscope);
|
os_android->process_gyroscope(gyroscope);
|
||||||
|
@ -1386,6 +1389,10 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_accelerometer(JNIEnv
|
||||||
accelerometer = Vector3(x, y, z);
|
accelerometer = Vector3(x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_gravity(JNIEnv *env, jobject obj, jfloat x, jfloat y, jfloat z) {
|
||||||
|
gravity = Vector3(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_magnetometer(JNIEnv *env, jobject obj, jfloat x, jfloat y, jfloat z) {
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_magnetometer(JNIEnv *env, jobject obj, jfloat x, jfloat y, jfloat z) {
|
||||||
magnetometer = Vector3(x, y, z);
|
magnetometer = Vector3(x, y, z);
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyhat(JNIEnv *env, j
|
||||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyconnectionchanged(JNIEnv *env, jobject obj, jint p_device, jboolean p_connected, jstring p_name);
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyconnectionchanged(JNIEnv *env, jobject obj, jint p_device, jboolean p_connected, jstring p_name);
|
||||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_audio(JNIEnv *env, jobject obj);
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_audio(JNIEnv *env, jobject obj);
|
||||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_accelerometer(JNIEnv *env, jobject obj, jfloat x, jfloat y, jfloat z);
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_accelerometer(JNIEnv *env, jobject obj, jfloat x, jfloat y, jfloat z);
|
||||||
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_gravity(JNIEnv *env, jobject obj, jfloat x, jfloat y, jfloat z);
|
||||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_magnetometer(JNIEnv *env, jobject obj, jfloat x, jfloat y, jfloat z);
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_magnetometer(JNIEnv *env, jobject obj, jfloat x, jfloat y, jfloat z);
|
||||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_gyroscope(JNIEnv *env, jobject obj, jfloat x, jfloat y, jfloat z);
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_gyroscope(JNIEnv *env, jobject obj, jfloat x, jfloat y, jfloat z);
|
||||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusin(JNIEnv *env, jobject obj);
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusin(JNIEnv *env, jobject obj);
|
||||||
|
|
|
@ -490,6 +490,11 @@ void OS_Android::process_accelerometer(const Vector3 &p_accelerometer) {
|
||||||
input->set_accelerometer(p_accelerometer);
|
input->set_accelerometer(p_accelerometer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OS_Android::process_gravity(const Vector3 &p_gravity) {
|
||||||
|
|
||||||
|
input->set_gravity(p_gravity);
|
||||||
|
}
|
||||||
|
|
||||||
void OS_Android::process_magnetometer(const Vector3 &p_magnetometer) {
|
void OS_Android::process_magnetometer(const Vector3 &p_magnetometer) {
|
||||||
|
|
||||||
input->set_magnetometer(p_magnetometer);
|
input->set_magnetometer(p_magnetometer);
|
||||||
|
|
|
@ -219,6 +219,7 @@ public:
|
||||||
virtual String get_system_dir(SystemDir p_dir) const;
|
virtual String get_system_dir(SystemDir p_dir) const;
|
||||||
|
|
||||||
void process_accelerometer(const Vector3 &p_accelerometer);
|
void process_accelerometer(const Vector3 &p_accelerometer);
|
||||||
|
void process_gravity(const Vector3 &p_gravity);
|
||||||
void process_magnetometer(const Vector3 &p_magnetometer);
|
void process_magnetometer(const Vector3 &p_magnetometer);
|
||||||
void process_gyroscope(const Vector3 &p_gyroscope);
|
void process_gyroscope(const Vector3 &p_gyroscope);
|
||||||
void process_touch(int p_what, int p_pointer, const Vector<TouchPos> &p_points);
|
void process_touch(int p_what, int p_pointer, const Vector<TouchPos> &p_points);
|
||||||
|
|
Loading…
Reference in a new issue