Merge pull request #5718 from jay3d/master
Added gyroscope support to Godot and Android
This commit is contained in:
commit
8de5aedb9e
12 changed files with 73 additions and 1 deletions
|
@ -66,6 +66,7 @@ void Input::_bind_methods() {
|
|||
ObjectTypeDB::bind_method(_MD("stop_joy_vibration", "device"), &Input::stop_joy_vibration);
|
||||
ObjectTypeDB::bind_method(_MD("get_accelerometer"),&Input::get_accelerometer);
|
||||
ObjectTypeDB::bind_method(_MD("get_magnetometer"),&Input::get_magnetometer);
|
||||
ObjectTypeDB::bind_method(_MD("get_gyroscope"),&Input::get_gyroscope);
|
||||
//ObjectTypeDB::bind_method(_MD("get_mouse_pos"),&Input::get_mouse_pos); - this is not the function you want
|
||||
ObjectTypeDB::bind_method(_MD("get_mouse_speed"),&Input::get_mouse_speed);
|
||||
ObjectTypeDB::bind_method(_MD("get_mouse_button_mask"),&Input::get_mouse_button_mask);
|
||||
|
|
|
@ -82,6 +82,7 @@ public:
|
|||
|
||||
virtual Vector3 get_accelerometer()=0;
|
||||
virtual Vector3 get_magnetometer()=0;
|
||||
virtual Vector3 get_gyroscope()=0;
|
||||
|
||||
virtual void action_press(const StringName& p_action)=0;
|
||||
virtual void action_release(const StringName& p_action)=0;
|
||||
|
|
|
@ -15797,6 +15797,13 @@
|
|||
Returns an [Array] containing the device IDs of all currently connected joysticks.
|
||||
</description>
|
||||
</method>
|
||||
<method name="get_gyroscope">
|
||||
<return type="Vector3">
|
||||
</return>
|
||||
<description>
|
||||
If the device has a gyroscope, this will return the rate of rotation in rad/s around a device's x, y, and z axis.
|
||||
</description>
|
||||
</method>
|
||||
<method name="get_joy_axis">
|
||||
<return type="float">
|
||||
</return>
|
||||
|
|
|
@ -259,6 +259,12 @@ Vector3 InputDefault::get_magnetometer() {
|
|||
return magnetometer;
|
||||
}
|
||||
|
||||
Vector3 InputDefault::get_gyroscope() {
|
||||
|
||||
_THREAD_SAFE_METHOD_
|
||||
return gyroscope;
|
||||
}
|
||||
|
||||
void InputDefault::parse_input_event(const InputEvent& p_event) {
|
||||
|
||||
_THREAD_SAFE_METHOD_
|
||||
|
@ -386,6 +392,14 @@ void InputDefault::set_magnetometer(const Vector3& p_magnetometer) {
|
|||
|
||||
}
|
||||
|
||||
void InputDefault::set_gyroscope(const Vector3& p_gyroscope) {
|
||||
|
||||
_THREAD_SAFE_METHOD_
|
||||
|
||||
gyroscope=p_gyroscope;
|
||||
|
||||
}
|
||||
|
||||
void InputDefault::set_main_loop(MainLoop *p_main_loop) {
|
||||
main_loop=p_main_loop;
|
||||
|
||||
|
|
|
@ -44,6 +44,7 @@ class InputDefault : public Input {
|
|||
Map<StringName,int> custom_action_press;
|
||||
Vector3 accelerometer;
|
||||
Vector3 magnetometer;
|
||||
Vector3 gyroscope;
|
||||
Vector2 mouse_pos;
|
||||
MainLoop *main_loop;
|
||||
|
||||
|
@ -179,6 +180,7 @@ public:
|
|||
|
||||
virtual Vector3 get_accelerometer();
|
||||
virtual Vector3 get_magnetometer();
|
||||
virtual Vector3 get_gyroscope();
|
||||
|
||||
virtual Point2 get_mouse_pos() const;
|
||||
virtual Point2 get_mouse_speed() const;
|
||||
|
@ -190,6 +192,7 @@ public:
|
|||
void parse_input_event(const InputEvent& p_event);
|
||||
void set_accelerometer(const Vector3& p_accel);
|
||||
void set_magnetometer(const Vector3& p_magnetometer);
|
||||
void set_gyroscope(const Vector3& p_gyroscope);
|
||||
void set_joy_axis(int p_device,int p_axis,float p_value);
|
||||
|
||||
virtual void start_joy_vibration(int p_device, float p_weak_magnitude, float p_strong_magnitude, float p_duration=0);
|
||||
|
|
|
@ -314,6 +314,7 @@ struct engine {
|
|||
ASensorManager* sensorManager;
|
||||
const ASensor* accelerometerSensor;
|
||||
const ASensor* magnetometerSensor;
|
||||
const ASensor* gyroscopeSensor;
|
||||
ASensorEventQueue* sensorEventQueue;
|
||||
|
||||
bool display_active;
|
||||
|
@ -745,6 +746,15 @@ static void engine_handle_cmd(struct android_app* app, int32_t cmd) {
|
|||
ASensorEventQueue_setEventRate(engine->sensorEventQueue,
|
||||
engine->magnetometerSensor, (1000L/60)*1000);
|
||||
|
||||
}
|
||||
// And the gyroscope.
|
||||
if (engine->gyroscopeSensor != NULL) {
|
||||
ASensorEventQueue_enableSensor(engine->sensorEventQueue,
|
||||
engine->gyroscopeSensor);
|
||||
// We'd like to get 60 events per second (in us).
|
||||
ASensorEventQueue_setEventRate(engine->sensorEventQueue,
|
||||
engine->gyroscopeSensor, (1000L/60)*1000);
|
||||
|
||||
}
|
||||
engine->animating = 1;
|
||||
break;
|
||||
|
@ -759,6 +769,10 @@ static void engine_handle_cmd(struct android_app* app, int32_t cmd) {
|
|||
ASensorEventQueue_disableSensor(engine->sensorEventQueue,
|
||||
engine->magnetometerSensor);
|
||||
}
|
||||
if (engine->gyroscopeSensor != NULL) {
|
||||
ASensorEventQueue_disableSensor(engine->sensorEventQueue,
|
||||
engine->gyroscopeSensor);
|
||||
}
|
||||
// Also stop animating.
|
||||
engine->animating = 0;
|
||||
engine_draw_frame(engine);
|
||||
|
@ -788,6 +802,8 @@ void android_main(struct android_app* state) {
|
|||
ASENSOR_TYPE_ACCELEROMETER);
|
||||
engine.magnetometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager,
|
||||
ASENSOR_TYPE_MAGNETIC_FIELD);
|
||||
engine.gyroscopeSensor = ASensorManager_getDefaultSensor(engine.sensorManager,
|
||||
ASENSOR_TYPE_GYROSCOPE);
|
||||
engine.sensorEventQueue = ASensorManager_createEventQueue(engine.sensorManager,
|
||||
state->looper, LOOPER_ID_USER, NULL, NULL);
|
||||
|
||||
|
@ -828,7 +844,7 @@ void android_main(struct android_app* state) {
|
|||
// If a sensor has data, process it now.
|
||||
// LOGI("events\n");
|
||||
if (ident == LOOPER_ID_USER) {
|
||||
if (engine.accelerometerSensor != NULL || engine.magnetometerSensor != NULL) {
|
||||
if (engine.accelerometerSensor != NULL || engine.magnetometerSensor != NULL || engine.gyroscopeSensor != NULL) {
|
||||
ASensorEvent event;
|
||||
while (ASensorEventQueue_getEvents(engine.sensorEventQueue,
|
||||
&event, 1) > 0) {
|
||||
|
@ -843,6 +859,10 @@ void android_main(struct android_app* state) {
|
|||
engine.os->process_magnetometer(Vector3(event.magnetic.x, event.magnetic.y,
|
||||
event.magnetic.z));
|
||||
}
|
||||
if (event.vector != NULL) {
|
||||
engine.os->process_gyroscope(Vector3(event.vector.x, event.vector.y,
|
||||
event.vector.z));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -217,6 +217,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
|||
private SensorManager mSensorManager;
|
||||
private Sensor mAccelerometer;
|
||||
private Sensor mMagnetometer;
|
||||
private Sensor mGyroscope;
|
||||
|
||||
public FrameLayout layout;
|
||||
public RelativeLayout adLayout;
|
||||
|
@ -387,6 +388,8 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
|||
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_GAME);
|
||||
mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
|
||||
mSensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_GAME);
|
||||
mGyroscope = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
|
||||
mSensorManager.registerListener(this, mGyroscope, SensorManager.SENSOR_DELAY_GAME);
|
||||
|
||||
result_callback = null;
|
||||
|
||||
|
@ -604,6 +607,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
|||
mView.onResume();
|
||||
mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_GAME);
|
||||
mSensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_GAME);
|
||||
mSensorManager.registerListener(this, mGyroscope, SensorManager.SENSOR_DELAY_GAME);
|
||||
GodotLib.focusin();
|
||||
if(use_immersive && Build.VERSION.SDK_INT >= 19.0){ // check if the application runs on an android 4.4+
|
||||
Window window = getWindow();
|
||||
|
@ -670,6 +674,9 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
|||
if (typeOfSensor == event.sensor.TYPE_MAGNETIC_FIELD) {
|
||||
GodotLib.magnetometer(x,y,z);
|
||||
}
|
||||
if (typeOfSensor == event.sensor.TYPE_GYROSCOPE) {
|
||||
GodotLib.gyroscope(x,y,z);
|
||||
}
|
||||
}
|
||||
|
||||
@Override public final void onAccuracyChanged(Sensor sensor, int accuracy) {
|
||||
|
|
|
@ -52,6 +52,7 @@ public class GodotLib {
|
|||
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 magnetometer(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 joybutton(int p_device, int p_but, boolean p_pressed);
|
||||
public static native void joyaxis(int p_device, int p_axis, float p_value);
|
||||
|
|
|
@ -653,6 +653,7 @@ static bool quit_request=false;
|
|||
static Size2 new_size;
|
||||
static Vector3 accelerometer;
|
||||
static Vector3 magnetometer;
|
||||
static Vector3 gyroscope;
|
||||
static HashMap<String,JNISingleton*> jni_singletons;
|
||||
static jobject godot_io;
|
||||
|
||||
|
@ -1093,6 +1094,8 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv * env, jo
|
|||
|
||||
os_android->process_magnetometer(magnetometer);
|
||||
|
||||
os_android->process_gyroscope(gyroscope);
|
||||
|
||||
if (os_android->main_loop_iterate()==true) {
|
||||
|
||||
jclass cls = env->FindClass("org/godotengine/godot/Godot");
|
||||
|
@ -1501,6 +1504,14 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_magnetometer(JNIEnv *
|
|||
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_gyroscope(JNIEnv * env, jobject obj, jfloat x, jfloat y, jfloat z) {
|
||||
|
||||
input_mutex->lock();
|
||||
gyroscope=Vector3(x,y,z);
|
||||
input_mutex->unlock();
|
||||
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusin(JNIEnv * env, jobject obj){
|
||||
|
||||
if (!suspend_mutex)
|
||||
|
|
|
@ -50,6 +50,7 @@ extern "C" {
|
|||
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_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_focusin(JNIEnv * env, jobject obj);
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusout(JNIEnv * env, jobject obj);
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_singleton(JNIEnv * env, jobject obj, jstring name,jobject p_object);
|
||||
|
|
|
@ -614,6 +614,11 @@ void OS_Android::process_magnetometer(const Vector3& p_magnetometer) {
|
|||
input->set_magnetometer(p_magnetometer);
|
||||
}
|
||||
|
||||
void OS_Android::process_gyroscope(const Vector3& p_gyroscope) {
|
||||
|
||||
input->set_gyroscope(p_gyroscope);
|
||||
}
|
||||
|
||||
bool OS_Android::has_touchscreen_ui_hint() const {
|
||||
|
||||
return true;
|
||||
|
|
|
@ -242,6 +242,7 @@ public:
|
|||
|
||||
void process_accelerometer(const Vector3& p_accelerometer);
|
||||
void process_magnetometer(const Vector3& p_magnetometer);
|
||||
void process_gyroscope(const Vector3& p_gyroscope);
|
||||
void process_touch(int p_what,int p_pointer, const Vector<TouchPos>& p_points);
|
||||
void process_joy_event(JoystickEvent p_event);
|
||||
void process_event(InputEvent p_event);
|
||||
|
|
Loading…
Reference in a new issue