mirror of
https://github.com/godotengine/godot.git
synced 2024-11-15 00:23:27 +00:00
Update the fallback input mapping for the Oculus mobile devices.
This commit is contained in:
parent
be99e7b68f
commit
5eaaabceaf
@ -58,6 +58,7 @@ import android.os.Environment;
|
||||
import android.os.Messenger;
|
||||
import android.os.Vibrator;
|
||||
import android.provider.Settings.Secure;
|
||||
import android.support.annotation.Keep;
|
||||
import android.support.v4.content.ContextCompat;
|
||||
import android.view.Display;
|
||||
import android.view.KeyEvent;
|
||||
@ -101,7 +102,6 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||
static final int REQUEST_CAMERA_PERMISSION = 2;
|
||||
static final int REQUEST_VIBRATE_PERMISSION = 3;
|
||||
private IStub mDownloaderClientStub;
|
||||
private IDownloaderService mRemoteService;
|
||||
private TextView mStatusText;
|
||||
private TextView mProgressFraction;
|
||||
private TextView mProgressPercent;
|
||||
@ -224,15 +224,9 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||
private Sensor mMagnetometer;
|
||||
private Sensor mGyroscope;
|
||||
|
||||
public FrameLayout layout;
|
||||
|
||||
public static GodotIO io;
|
||||
|
||||
public static void setWindowTitle(String title) {
|
||||
//setTitle(title);
|
||||
}
|
||||
|
||||
static SingletonBase singletons[] = new SingletonBase[MAX_SINGLETONS];
|
||||
static SingletonBase[] singletons = new SingletonBase[MAX_SINGLETONS];
|
||||
static int singleton_count = 0;
|
||||
|
||||
public interface ResultCallback {
|
||||
@ -268,13 +262,14 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||
}
|
||||
};
|
||||
|
||||
public void onVideoInit() {
|
||||
/**
|
||||
* Used by the native code (java_godot_lib_jni.cpp) to complete initialization of the GLSurfaceView view and renderer.
|
||||
*/
|
||||
@Keep
|
||||
private void onVideoInit() {
|
||||
boolean use_gl3 = getGLESVersionCode() >= 0x00030000;
|
||||
|
||||
//mView = new GodotView(getApplication(),io,use_gl3);
|
||||
//setContentView(mView);
|
||||
|
||||
layout = new FrameLayout(this);
|
||||
final FrameLayout layout = new FrameLayout(this);
|
||||
layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
|
||||
setContentView(layout);
|
||||
|
||||
@ -326,11 +321,16 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||
});
|
||||
}
|
||||
|
||||
public void vibrate(int p_duration_ms) {
|
||||
/**
|
||||
* Used by the native code (java_godot_wrapper.h) to vibrate the device.
|
||||
* @param durationMs
|
||||
*/
|
||||
@Keep
|
||||
private void vibrate(int durationMs) {
|
||||
if (requestPermission("VIBRATE")) {
|
||||
Vibrator v = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
|
||||
if (v != null) {
|
||||
v.vibrate(p_duration_ms);
|
||||
v.vibrate(durationMs);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -416,6 +416,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||
/**
|
||||
* Used by the native code (java_godot_wrapper.h) to check whether the activity is resumed or paused.
|
||||
*/
|
||||
@Keep
|
||||
private boolean isActivityResumed() {
|
||||
return activityResumed;
|
||||
}
|
||||
@ -423,10 +424,20 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||
/**
|
||||
* Used by the native code (java_godot_wrapper.h) to access the Android surface.
|
||||
*/
|
||||
@Keep
|
||||
private Surface getSurface() {
|
||||
return mView.getHolder().getSurface();
|
||||
}
|
||||
|
||||
/**
|
||||
* Used by the native code (java_godot_wrapper.h) to access the input fallback mapping.
|
||||
* @return The input fallback mapping for the current XR mode.
|
||||
*/
|
||||
@Keep
|
||||
private String getInputFallbackMapping() {
|
||||
return xrMode.inputFallbackMapping;
|
||||
}
|
||||
|
||||
String expansion_pack_path;
|
||||
|
||||
private void initializeGodot() {
|
||||
@ -474,8 +485,8 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||
|
||||
@Override
|
||||
public void onServiceConnected(Messenger m) {
|
||||
mRemoteService = DownloaderServiceMarshaller.CreateProxy(m);
|
||||
mRemoteService.onClientUpdated(mDownloaderClientStub.getMessenger());
|
||||
IDownloaderService remoteService = DownloaderServiceMarshaller.CreateProxy(m);
|
||||
remoteService.onClientUpdated(mDownloaderClientStub.getMessenger());
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -483,7 +494,6 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||
|
||||
super.onCreate(icicle);
|
||||
Window window = getWindow();
|
||||
//window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
||||
window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
|
||||
mClipboard = (ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
|
||||
@ -609,7 +619,6 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||
mWiFiSettingsButton = (Button)findViewById(com.godot.game.R.id.wifiSettingsButton);
|
||||
|
||||
return;
|
||||
} else {
|
||||
}
|
||||
} catch (NameNotFoundException e) {
|
||||
// TODO Auto-generated catch block
|
||||
@ -621,8 +630,6 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||
mCurrentIntent = getIntent();
|
||||
|
||||
initializeGodot();
|
||||
|
||||
//instanceSingleton( new GodotFacebook(this) );
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -831,8 +838,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||
}
|
||||
}
|
||||
|
||||
public void forceQuit() {
|
||||
|
||||
private void forceQuit() {
|
||||
System.exit(0);
|
||||
}
|
||||
|
||||
@ -879,7 +885,6 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||
}
|
||||
}
|
||||
|
||||
//@Override public boolean dispatchTouchEvent (MotionEvent event) {
|
||||
public boolean gotTouchEvent(final MotionEvent event) {
|
||||
|
||||
final int evcount = event.getPointerCount();
|
||||
@ -950,8 +955,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||
for (int i = cc.length; --i >= 0; cnt += cc[i] != 0 ? 1 : 0)
|
||||
;
|
||||
if (cnt == 0) return super.onKeyMultiple(inKeyCode, repeatCount, event);
|
||||
final Activity me = this;
|
||||
queueEvent(new Runnable() {
|
||||
mView.queueEvent(new Runnable() {
|
||||
// This method will be called on the rendering thread:
|
||||
public void run() {
|
||||
for (int i = 0, n = cc.length; i < n; i++) {
|
||||
@ -967,20 +971,10 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||
return true;
|
||||
}
|
||||
|
||||
private void queueEvent(Runnable runnable) {
|
||||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
public PaymentsManager getPaymentsManager() {
|
||||
return mPaymentsManager;
|
||||
}
|
||||
|
||||
/*
|
||||
public void setPaymentsManager(PaymentsManager mPaymentsManager) {
|
||||
this.mPaymentsManager = mPaymentsManager;
|
||||
}
|
||||
*/
|
||||
|
||||
public boolean requestPermission(String p_name) {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
|
||||
// Not necessary, asked on install already
|
||||
@ -1025,7 +1019,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
|
||||
switch (newState) {
|
||||
case IDownloaderClient.STATE_IDLE:
|
||||
// STATE_IDLE means the service is listening, so it's
|
||||
// safe to start making calls via mRemoteService.
|
||||
// safe to start making remote service calls.
|
||||
paused = false;
|
||||
indeterminate = true;
|
||||
break;
|
||||
|
@ -30,8 +30,14 @@
|
||||
|
||||
package org.godotengine.godot;
|
||||
|
||||
// Wrapper for native library
|
||||
import android.app.Activity;
|
||||
import android.hardware.SensorEvent;
|
||||
import javax.microedition.khronos.egl.EGLConfig;
|
||||
import javax.microedition.khronos.opengles.GL10;
|
||||
|
||||
/**
|
||||
* Wrapper for native library
|
||||
*/
|
||||
public class GodotLib {
|
||||
|
||||
public static GodotIO io;
|
||||
@ -41,36 +47,168 @@ public class GodotLib {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param width the current view width
|
||||
* @param height the current view height
|
||||
*/
|
||||
|
||||
* Invoked on the main thread to initialize Godot native layer.
|
||||
*/
|
||||
public static native void initialize(Godot p_instance, Object p_asset_manager, boolean use_apk_expansion);
|
||||
|
||||
/**
|
||||
* Invoked on the main thread to clean up Godot native layer.
|
||||
* @see Activity#onDestroy()
|
||||
*/
|
||||
public static native void ondestroy(Godot p_instance);
|
||||
|
||||
/**
|
||||
* Invoked on the GL thread to complete setup for the Godot native layer logic.
|
||||
* @param p_cmdline Command line arguments used to configure Godot native layer components.
|
||||
*/
|
||||
public static native void setup(String[] p_cmdline);
|
||||
|
||||
/**
|
||||
* Invoked on the GL thread when the underlying Android surface has changed size.
|
||||
* @param width
|
||||
* @param height
|
||||
* @see android.opengl.GLSurfaceView.Renderer#onSurfaceChanged(GL10, int, int)
|
||||
*/
|
||||
public static native void resize(int width, int height);
|
||||
|
||||
/**
|
||||
* Invoked on the GL thread when the underlying Android surface is created or recreated.
|
||||
* @param p_32_bits
|
||||
* @see android.opengl.GLSurfaceView.Renderer#onSurfaceCreated(GL10, EGLConfig)
|
||||
*/
|
||||
public static native void newcontext(boolean p_32_bits);
|
||||
|
||||
/**
|
||||
* Forward {@link Activity#onBackPressed()} event from the main thread to the GL thread.
|
||||
*/
|
||||
public static native void back();
|
||||
|
||||
/**
|
||||
* Invoked on the GL thread to draw the current frame.
|
||||
* @see android.opengl.GLSurfaceView.Renderer#onDrawFrame(GL10)
|
||||
*/
|
||||
public static native void step();
|
||||
|
||||
/**
|
||||
* Forward touch events from the main thread to the GL thread.
|
||||
*/
|
||||
public static native void touch(int what, int pointer, int howmany, int[] arr);
|
||||
|
||||
/**
|
||||
* Forward accelerometer sensor events from the main thread to the GL thread.
|
||||
* @see android.hardware.SensorEventListener#onSensorChanged(SensorEvent)
|
||||
*/
|
||||
public static native void accelerometer(float x, float y, float z);
|
||||
|
||||
/**
|
||||
* Forward gravity sensor events from the main thread to the GL thread.
|
||||
* @see android.hardware.SensorEventListener#onSensorChanged(SensorEvent)
|
||||
*/
|
||||
public static native void gravity(float x, float y, float z);
|
||||
|
||||
/**
|
||||
* Forward magnetometer sensor events from the main thread to the GL thread.
|
||||
* @see android.hardware.SensorEventListener#onSensorChanged(SensorEvent)
|
||||
*/
|
||||
public static native void magnetometer(float x, float y, float z);
|
||||
|
||||
/**
|
||||
* Forward gyroscope sensor events from the main thread to the GL thread.
|
||||
* @see android.hardware.SensorEventListener#onSensorChanged(SensorEvent)
|
||||
*/
|
||||
public static native void gyroscope(float x, float y, float z);
|
||||
|
||||
/**
|
||||
* Forward regular key events from the main thread to the GL thread.
|
||||
*/
|
||||
public static native void key(int p_scancode, int p_unicode_char, boolean p_pressed);
|
||||
|
||||
/**
|
||||
* Forward game device's key events from the main thread to the GL thread.
|
||||
*/
|
||||
public static native void joybutton(int p_device, int p_but, boolean p_pressed);
|
||||
|
||||
/**
|
||||
* Forward joystick devices axis motion events from the main thread to the GL thread.
|
||||
*/
|
||||
public static native void joyaxis(int p_device, int p_axis, float p_value);
|
||||
|
||||
/**
|
||||
* Forward joystick devices hat motion events from the main thread to the GL thread.
|
||||
*/
|
||||
public static native void joyhat(int p_device, int p_hat_x, int p_hat_y);
|
||||
|
||||
/**
|
||||
* Fires when a joystick device is added or removed.
|
||||
*/
|
||||
public static native void joyconnectionchanged(int p_device, boolean p_connected, String p_name);
|
||||
|
||||
/**
|
||||
* Invoked when the Android activity resumes.
|
||||
* @see Activity#onResume()
|
||||
*/
|
||||
public static native void focusin();
|
||||
|
||||
/**
|
||||
* Invoked when the Android activity pauses.
|
||||
* @see Activity#onPause()
|
||||
*/
|
||||
public static native void focusout();
|
||||
|
||||
/**
|
||||
* Invoked when the audio thread is started.
|
||||
*/
|
||||
public static native void audio();
|
||||
|
||||
/**
|
||||
* Used to setup a {@link org.godotengine.godot.Godot.SingletonBase} instance.
|
||||
* @param p_name Name of the instance.
|
||||
* @param p_object Reference to the singleton instance.
|
||||
*/
|
||||
public static native void singleton(String p_name, Object p_object);
|
||||
|
||||
/**
|
||||
* Used to complete registration of the {@link org.godotengine.godot.Godot.SingletonBase} instance's methods.
|
||||
* @param p_sname Name of the instance
|
||||
* @param p_name Name of the method to register
|
||||
* @param p_ret Return type of the registered method
|
||||
* @param p_params Method parameters types
|
||||
*/
|
||||
public static native void method(String p_sname, String p_name, String p_ret, String[] p_params);
|
||||
|
||||
/**
|
||||
* Used to access Godot global properties.
|
||||
* @param p_key Property key
|
||||
* @return String value of the property
|
||||
*/
|
||||
public static native String getGlobal(String p_key);
|
||||
|
||||
/**
|
||||
* Invoke method |p_method| on the Godot object specified by |p_id|
|
||||
* @param p_id Id of the Godot object to invoke
|
||||
* @param p_method Name of the method to invoke
|
||||
* @param p_params Parameters to use for method invocation
|
||||
*/
|
||||
public static native void callobject(int p_id, String p_method, Object[] p_params);
|
||||
|
||||
/**
|
||||
* Invoke method |p_method| on the Godot object specified by |p_id| during idle time.
|
||||
* @param p_id Id of the Godot object to invoke
|
||||
* @param p_method Name of the method to invoke
|
||||
* @param p_params Parameters to use for method invocation
|
||||
*/
|
||||
public static native void calldeferred(int p_id, String p_method, Object[] p_params);
|
||||
|
||||
/**
|
||||
* Forward the results from a permission request.
|
||||
* @see Activity#onRequestPermissionsResult(int, String[], int[])
|
||||
* @param p_permission Request permission
|
||||
* @param p_result True if the permission was granted, false otherwise
|
||||
*/
|
||||
public static native void requestPermissionResult(String p_permission, boolean p_result);
|
||||
|
||||
/**
|
||||
* Invoked on the GL thread to configure the height of the virtual keyboard.
|
||||
*/
|
||||
public static native void setVirtualKeyboardHeight(int p_height);
|
||||
}
|
||||
|
@ -34,16 +34,18 @@ package org.godotengine.godot.xr;
|
||||
* Godot available XR modes.
|
||||
*/
|
||||
public enum XRMode {
|
||||
REGULAR(0, "Regular", "--xr_mode_regular"), // Regular/flatscreen
|
||||
OVR(1, "Oculus Mobile VR", "--xr_mode_ovr");
|
||||
REGULAR(0, "Regular", "--xr_mode_regular", "Default Android Gamepad"), // Regular/flatscreen
|
||||
OVR(1, "Oculus Mobile VR", "--xr_mode_ovr", "");
|
||||
|
||||
final int index;
|
||||
final String label;
|
||||
public final String cmdLineArg;
|
||||
public final String inputFallbackMapping;
|
||||
|
||||
XRMode(int index, String label, String cmdLineArg) {
|
||||
XRMode(int index, String label, String cmdLineArg, String inputFallbackMapping) {
|
||||
this.index = index;
|
||||
this.label = label;
|
||||
this.cmdLineArg = cmdLineArg;
|
||||
this.inputFallbackMapping = inputFallbackMapping;
|
||||
}
|
||||
}
|
||||
|
@ -644,7 +644,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv *en
|
||||
godot_java->on_video_init(env);
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_ondestroy(JNIEnv *env) {
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_ondestroy(JNIEnv *env, jobject obj, jobject activity) {
|
||||
// lets cleanup
|
||||
if (godot_io_java) {
|
||||
delete godot_io_java;
|
||||
|
@ -38,7 +38,7 @@
|
||||
// See java/src/org/godotengine/godot/GodotLib.java for the JAVA side of this (yes that's why we have the long names)
|
||||
extern "C" {
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv *env, jobject obj, jobject activity, jobject p_asset_manager, jboolean p_use_apk_expansion);
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_ondestroy(JNIEnv *env);
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_ondestroy(JNIEnv *env, jobject obj, jobject activity);
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_setup(JNIEnv *env, jobject obj, jobjectArray p_cmdline);
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_resize(JNIEnv *env, jobject obj, jint width, jint height);
|
||||
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_newcontext(JNIEnv *env, jobject obj, bool p_32_bits);
|
||||
|
@ -63,6 +63,7 @@ GodotJavaWrapper::GodotJavaWrapper(JNIEnv *p_env, jobject p_godot_instance) {
|
||||
_get_surface = p_env->GetMethodID(cls, "getSurface", "()Landroid/view/Surface;");
|
||||
_is_activity_resumed = p_env->GetMethodID(cls, "isActivityResumed", "()Z");
|
||||
_vibrate = p_env->GetMethodID(cls, "vibrate", "(I)V");
|
||||
_get_input_fallback_mapping = p_env->GetMethodID(cls, "getInputFallbackMapping", "()Ljava/lang/String;");
|
||||
}
|
||||
|
||||
GodotJavaWrapper::~GodotJavaWrapper() {
|
||||
@ -166,6 +167,16 @@ String GodotJavaWrapper::get_clipboard() {
|
||||
}
|
||||
}
|
||||
|
||||
String GodotJavaWrapper::get_input_fallback_mapping() {
|
||||
if (_get_input_fallback_mapping) {
|
||||
JNIEnv *env = ThreadAndroid::get_env();
|
||||
jstring fallback_mapping = (jstring)env->CallObjectMethod(godot_instance, _get_input_fallback_mapping);
|
||||
return jstring_to_string(fallback_mapping, env);
|
||||
} else {
|
||||
return String();
|
||||
}
|
||||
}
|
||||
|
||||
bool GodotJavaWrapper::has_set_clipboard() {
|
||||
return _set_clipboard != 0;
|
||||
}
|
||||
|
@ -58,6 +58,7 @@ private:
|
||||
jmethodID _get_surface = 0;
|
||||
jmethodID _is_activity_resumed = 0;
|
||||
jmethodID _vibrate = 0;
|
||||
jmethodID _get_input_fallback_mapping = 0;
|
||||
|
||||
public:
|
||||
GodotJavaWrapper(JNIEnv *p_env, jobject p_godot_instance);
|
||||
@ -84,6 +85,7 @@ public:
|
||||
jobject get_surface();
|
||||
bool is_activity_resumed();
|
||||
void vibrate(int p_duration_ms);
|
||||
String get_input_fallback_mapping();
|
||||
};
|
||||
|
||||
#endif /* !JAVA_GODOT_WRAPPER_H */
|
||||
|
@ -173,7 +173,7 @@ Error OS_Android::initialize(const VideoMode &p_desired, int p_video_driver, int
|
||||
AudioDriverManager::initialize(p_audio_driver);
|
||||
|
||||
input = memnew(InputDefault);
|
||||
input->set_fallback_mapping("Default Android Gamepad");
|
||||
input->set_fallback_mapping(godot_java->get_input_fallback_mapping());
|
||||
|
||||
///@TODO implement a subclass for Android and instantiate that instead
|
||||
camera_server = memnew(CameraServer);
|
||||
|
Loading…
Reference in New Issue
Block a user