Unverified Commit d2c416ec by Rémi Verschelde Committed by GitHub

Merge pull request #29824 from m4gr3d/add_ovr_export

Add XR mode selection to the Android export process.
parents e8b483ce 12e0dc1b
...@@ -665,6 +665,8 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { ...@@ -665,6 +665,8 @@ class EditorExportPlatformAndroid : public EditorExportPlatform {
bool screen_support_large = p_preset->get("screen/support_large"); bool screen_support_large = p_preset->get("screen/support_large");
bool screen_support_xlarge = p_preset->get("screen/support_xlarge"); bool screen_support_xlarge = p_preset->get("screen/support_xlarge");
int xr_mode_index = p_preset->get("graphics/xr_mode");
Vector<String> perms; Vector<String> perms;
const char **aperms = android_perms; const char **aperms = android_perms;
...@@ -822,6 +824,14 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { ...@@ -822,6 +824,14 @@ class EditorExportPlatformAndroid : public EditorExportPlatform {
encode_uint32(min_gles3 ? 0x00030000 : 0x00020000, &p_manifest.write[iofs + 16]); encode_uint32(min_gles3 ? 0x00030000 : 0x00020000, &p_manifest.write[iofs + 16]);
} }
if (tname == "meta-data" && attrname == "value") {
if (xr_mode_index == 1 /* XRMode.OVR */) {
string_table.write[attr_value] = "vr_only";
} else {
string_table.write[attr_value] = "";
}
}
iofs += 20; iofs += 20;
} }
...@@ -1139,6 +1149,7 @@ public: ...@@ -1139,6 +1149,7 @@ public:
virtual void get_export_options(List<ExportOption> *r_options) { virtual void get_export_options(List<ExportOption> *r_options) {
r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "graphics/xr_mode", PROPERTY_HINT_ENUM, "Regular,Oculus Mobile VR"), 0));
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "graphics/32_bits_framebuffer"), true)); r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "graphics/32_bits_framebuffer"), true));
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "one_click_deploy/clear_previous_install"), true)); r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "one_click_deploy/clear_previous_install"), true));
r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "custom_package/debug", PROPERTY_HINT_GLOBAL_FILE, "*.apk"), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "custom_package/debug", PROPERTY_HINT_GLOBAL_FILE, "*.apk"), ""));
...@@ -2071,6 +2082,14 @@ public: ...@@ -2071,6 +2082,14 @@ public:
} }
} }
int xr_mode_index = p_preset->get("graphics/xr_mode");
if (xr_mode_index == 1 /* XRMode.OVR */) {
cl.push_back("--xr_mode_ovr");
} else {
// XRMode.REGULAR is the default.
cl.push_back("--xr_mode_regular");
}
if (use_32_fb) if (use_32_fb)
cl.push_back("--use_depth_32"); cl.push_back("--use_depth_32");
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
<!--glEsVersion is modified by the exporter, changing this value here has no effect--> <!--glEsVersion is modified by the exporter, changing this value here has no effect-->
<uses-feature android:glEsVersion="0x00020000" android:required="true" /> <uses-feature android:glEsVersion="0x00020000" android:required="true" />
<!--Adding custom text to manifest is fine, but do it outside the custom user and application BEGIN/ENDregions, as that gets rewritten--> <!--Adding custom text to manifest is fine, but do it outside the custom user and application BEGIN/END regions, as that gets rewritten-->
<!--Custom permissions XML added by add-ons. It's recommended to add them from the export preset, though--> <!--Custom permissions XML added by add-ons. It's recommended to add them from the export preset, though-->
<!--CHUNK_USER_PERMISSIONS_BEGIN--> <!--CHUNK_USER_PERMISSIONS_BEGIN-->
...@@ -25,12 +25,15 @@ ...@@ -25,12 +25,15 @@
<!--The following values are replaced when Godot exports, modifying them here has no effect. Do these changes in the--> <!--The following values are replaced when Godot exports, modifying them here has no effect. Do these changes in the-->
<!--export preset. Adding new ones is fine.--> <!--export preset. Adding new ones is fine.-->
<!-- Metadata for VR app detection on Oculus devices. This is modified by the exporter based on the selected xr mode. Changing this value here has no effect. -->
<meta-data android:name="com.samsung.android.vr.application.mode" android:value=""/>
<activity android:name="org.godotengine.godot.Godot" <activity android:name="org.godotengine.godot.Godot"
android:label="@string/godot_project_name_string" android:label="@string/godot_project_name_string"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
android:launchMode="singleTask" android:launchMode="singleTask"
android:screenOrientation="landscape" android:screenOrientation="landscape"
android:configChanges="orientation|keyboardHidden|screenSize|smallestScreenSize" android:configChanges="orientation|keyboardHidden|screenSize|smallestScreenSize|density|keyboard|navigation|screenLayout|uiMode"
android:resizeableActivity="false" android:resizeableActivity="false"
tools:ignore="UnusedAttribute"> tools:ignore="UnusedAttribute">
......
...@@ -58,7 +58,6 @@ import android.os.Environment; ...@@ -58,7 +58,6 @@ import android.os.Environment;
import android.os.Messenger; import android.os.Messenger;
import android.provider.Settings.Secure; import android.provider.Settings.Secure;
import android.support.v4.content.ContextCompat; import android.support.v4.content.ContextCompat;
import android.util.Log;
import android.view.Display; import android.view.Display;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.MotionEvent; import android.view.MotionEvent;
...@@ -115,6 +114,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC ...@@ -115,6 +114,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
private Button mPauseButton; private Button mPauseButton;
private Button mWiFiSettingsButton; private Button mWiFiSettingsButton;
private XRMode xrMode = XRMode.REGULAR;
private boolean use_32_bits = false; private boolean use_32_bits = false;
private boolean use_immersive = false; private boolean use_immersive = false;
private boolean use_debug_opengl = false; private boolean use_debug_opengl = false;
...@@ -282,7 +282,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC ...@@ -282,7 +282,7 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
// ...add to FrameLayout // ...add to FrameLayout
layout.addView(edittext); layout.addView(edittext);
mView = new GodotView(this, XRMode.PANCAKE, use_gl3, use_32_bits, use_debug_opengl); mView = new GodotView(this, xrMode, use_gl3, use_32_bits, use_debug_opengl);
layout.addView(mView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); layout.addView(mView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
edittext.setView(mView); edittext.setView(mView);
io.setEdit(edittext); io.setEdit(edittext);
...@@ -488,7 +488,11 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC ...@@ -488,7 +488,11 @@ public class Godot extends Activity implements SensorEventListener, IDownloaderC
for (int i = 0; i < command_line.length; i++) { for (int i = 0; i < command_line.length; i++) {
boolean has_extra = i < command_line.length - 1; boolean has_extra = i < command_line.length - 1;
if (command_line[i].equals("--use_depth_32")) { if (command_line[i].equals(XRMode.REGULAR.cmdLineArg)) {
xrMode = XRMode.REGULAR;
} else if (command_line[i].equals(XRMode.OVR.cmdLineArg)) {
xrMode = XRMode.OVR;
} else if (command_line[i].equals("--use_depth_32")) {
use_32_bits = true; use_32_bits = true;
} else if (command_line[i].equals("--debug_opengl")) { } else if (command_line[i].equals("--debug_opengl")) {
use_debug_opengl = true; use_debug_opengl = true;
......
...@@ -40,9 +40,9 @@ import org.godotengine.godot.xr.XRMode; ...@@ -40,9 +40,9 @@ import org.godotengine.godot.xr.XRMode;
import org.godotengine.godot.xr.ovr.OvrConfigChooser; import org.godotengine.godot.xr.ovr.OvrConfigChooser;
import org.godotengine.godot.xr.ovr.OvrContextFactory; import org.godotengine.godot.xr.ovr.OvrContextFactory;
import org.godotengine.godot.xr.ovr.OvrWindowSurfaceFactory; import org.godotengine.godot.xr.ovr.OvrWindowSurfaceFactory;
import org.godotengine.godot.xr.pancake.PancakeConfigChooser; import org.godotengine.godot.xr.regular.RegularConfigChooser;
import org.godotengine.godot.xr.pancake.PancakeContextFactory; import org.godotengine.godot.xr.regular.RegularContextFactory;
import org.godotengine.godot.xr.pancake.PancakeFallbackConfigChooser; import org.godotengine.godot.xr.regular.RegularFallbackConfigChooser;
/** /**
* A simple GLSurfaceView sub-class that demonstrate how to perform * A simple GLSurfaceView sub-class that demonstrate how to perform
...@@ -123,7 +123,7 @@ public class GodotView extends GLSurfaceView { ...@@ -123,7 +123,7 @@ public class GodotView extends GLSurfaceView {
setEGLWindowSurfaceFactory(new OvrWindowSurfaceFactory()); setEGLWindowSurfaceFactory(new OvrWindowSurfaceFactory());
break; break;
case PANCAKE: case REGULAR:
default: default:
/* By default, GLSurfaceView() creates a RGB_565 opaque surface. /* By default, GLSurfaceView() creates a RGB_565 opaque surface.
* If we want a translucent one, we should change the surface's * If we want a translucent one, we should change the surface's
...@@ -137,7 +137,7 @@ public class GodotView extends GLSurfaceView { ...@@ -137,7 +137,7 @@ public class GodotView extends GLSurfaceView {
/* Setup the context factory for 2.0 rendering. /* Setup the context factory for 2.0 rendering.
* See ContextFactory class definition below * See ContextFactory class definition below
*/ */
setEGLContextFactory(new PancakeContextFactory()); setEGLContextFactory(new RegularContextFactory());
/* We need to choose an EGLConfig that matches the format of /* We need to choose an EGLConfig that matches the format of
* our surface exactly. This is going to be done in our * our surface exactly. This is going to be done in our
...@@ -147,15 +147,15 @@ public class GodotView extends GLSurfaceView { ...@@ -147,15 +147,15 @@ public class GodotView extends GLSurfaceView {
if (GLUtils.use_32) { if (GLUtils.use_32) {
setEGLConfigChooser(translucent ? setEGLConfigChooser(translucent ?
new PancakeFallbackConfigChooser(8, 8, 8, 8, 24, stencil, new RegularFallbackConfigChooser(8, 8, 8, 8, 24, stencil,
new PancakeConfigChooser(8, 8, 8, 8, 16, stencil)) : new RegularConfigChooser(8, 8, 8, 8, 16, stencil)) :
new PancakeFallbackConfigChooser(8, 8, 8, 8, 24, stencil, new RegularFallbackConfigChooser(8, 8, 8, 8, 24, stencil,
new PancakeConfigChooser(5, 6, 5, 0, 16, stencil))); new RegularConfigChooser(5, 6, 5, 0, 16, stencil)));
} else { } else {
setEGLConfigChooser(translucent ? setEGLConfigChooser(translucent ?
new PancakeConfigChooser(8, 8, 8, 8, 16, stencil) : new RegularConfigChooser(8, 8, 8, 8, 16, stencil) :
new PancakeConfigChooser(5, 6, 5, 0, 16, stencil)); new RegularConfigChooser(5, 6, 5, 0, 16, stencil));
} }
break; break;
} }
......
...@@ -34,6 +34,16 @@ package org.godotengine.godot.xr; ...@@ -34,6 +34,16 @@ package org.godotengine.godot.xr;
* Godot available XR modes. * Godot available XR modes.
*/ */
public enum XRMode { public enum XRMode {
PANCAKE, // Regular/flatscreen REGULAR(0, "Regular", "--xr_mode_regular"), // Regular/flatscreen
OVR, // Oculus mobile VR SDK OVR(1, "Oculus Mobile VR", "--xr_mode_ovr");
final int index;
final String label;
public final String cmdLineArg;
XRMode(int index, String label, String cmdLineArg) {
this.index = index;
this.label = label;
this.cmdLineArg = cmdLineArg;
}
} }
/*************************************************************************/ /*************************************************************************/
/* PancakeConfigChooser.java */ /* RegularConfigChooser.java */
/*************************************************************************/ /*************************************************************************/
/* This file is part of: */ /* This file is part of: */
/* GODOT ENGINE */ /* GODOT ENGINE */
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/ /*************************************************************************/
package org.godotengine.godot.xr.pancake; package org.godotengine.godot.xr.regular;
import android.opengl.GLSurfaceView; import android.opengl.GLSurfaceView;
import javax.microedition.khronos.egl.EGL10; import javax.microedition.khronos.egl.EGL10;
...@@ -39,9 +39,9 @@ import org.godotengine.godot.utils.GLUtils; ...@@ -39,9 +39,9 @@ import org.godotengine.godot.utils.GLUtils;
/** /**
* Used to select the egl config for pancake games. * Used to select the egl config for pancake games.
*/ */
public class PancakeConfigChooser implements GLSurfaceView.EGLConfigChooser { public class RegularConfigChooser implements GLSurfaceView.EGLConfigChooser {
private static final String TAG = PancakeConfigChooser.class.getSimpleName(); private static final String TAG = RegularConfigChooser.class.getSimpleName();
private int[] mValue = new int[1]; private int[] mValue = new int[1];
...@@ -69,7 +69,7 @@ public class PancakeConfigChooser implements GLSurfaceView.EGLConfigChooser { ...@@ -69,7 +69,7 @@ public class PancakeConfigChooser implements GLSurfaceView.EGLConfigChooser {
EGL10.EGL_NONE EGL10.EGL_NONE
}; };
public PancakeConfigChooser(int r, int g, int b, int a, int depth, int stencil) { public RegularConfigChooser(int r, int g, int b, int a, int depth, int stencil) {
mRedSize = r; mRedSize = r;
mGreenSize = g; mGreenSize = g;
mBlueSize = b; mBlueSize = b;
......
/*************************************************************************/ /*************************************************************************/
/* PancakeContextFactory.java */ /* RegularContextFactory.java */
/*************************************************************************/ /*************************************************************************/
/* This file is part of: */ /* This file is part of: */
/* GODOT ENGINE */ /* GODOT ENGINE */
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/ /*************************************************************************/
package org.godotengine.godot.xr.pancake; package org.godotengine.godot.xr.regular;
import android.opengl.GLSurfaceView; import android.opengl.GLSurfaceView;
import android.util.Log; import android.util.Log;
...@@ -42,8 +42,8 @@ import org.godotengine.godot.utils.GLUtils; ...@@ -42,8 +42,8 @@ import org.godotengine.godot.utils.GLUtils;
/** /**
* Factory used to setup the opengl context for pancake games. * Factory used to setup the opengl context for pancake games.
*/ */
public class PancakeContextFactory implements GLSurfaceView.EGLContextFactory { public class RegularContextFactory implements GLSurfaceView.EGLContextFactory {
private static final String TAG = PancakeContextFactory.class.getSimpleName(); private static final String TAG = RegularContextFactory.class.getSimpleName();
private static final int _EGL_CONTEXT_FLAGS_KHR = 0x30FC; private static final int _EGL_CONTEXT_FLAGS_KHR = 0x30FC;
private static final int _EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR = 0x00000001; private static final int _EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR = 0x00000001;
......
/*************************************************************************/ /*************************************************************************/
/* PancakeFallbackConfigChooser.java */ /* RegularFallbackConfigChooser.java */
/*************************************************************************/ /*************************************************************************/
/* This file is part of: */ /* This file is part of: */
/* GODOT ENGINE */ /* GODOT ENGINE */
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/ /*************************************************************************/
package org.godotengine.godot.xr.pancake; package org.godotengine.godot.xr.regular;
import android.util.Log; import android.util.Log;
import javax.microedition.khronos.egl.EGL10; import javax.microedition.khronos.egl.EGL10;
...@@ -37,13 +37,13 @@ import javax.microedition.khronos.egl.EGLDisplay; ...@@ -37,13 +37,13 @@ import javax.microedition.khronos.egl.EGLDisplay;
import org.godotengine.godot.utils.GLUtils; import org.godotengine.godot.utils.GLUtils;
/* Fallback if 32bit View is not supported*/ /* Fallback if 32bit View is not supported*/
public class PancakeFallbackConfigChooser extends PancakeConfigChooser { public class RegularFallbackConfigChooser extends RegularConfigChooser {
private static final String TAG = PancakeFallbackConfigChooser.class.getSimpleName(); private static final String TAG = RegularFallbackConfigChooser.class.getSimpleName();
private PancakeConfigChooser fallback; private RegularConfigChooser fallback;
public PancakeFallbackConfigChooser(int r, int g, int b, int a, int depth, int stencil, PancakeConfigChooser fallback) { public RegularFallbackConfigChooser(int r, int g, int b, int a, int depth, int stencil, RegularConfigChooser fallback) {
super(r, g, b, a, depth, stencil); super(r, g, b, a, depth, stencil);
this.fallback = fallback; this.fallback = fallback;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment