Add support for OpenXR export configurations.
This commit is contained in:
parent
4a29f657b6
commit
9c50bcabed
6 changed files with 70 additions and 18 deletions
|
@ -755,9 +755,9 @@ void EditorExportPlatformAndroid::_get_permissions(const Ref<EditorExportPreset>
|
||||||
}
|
}
|
||||||
|
|
||||||
int xr_mode_index = p_preset->get("xr_features/xr_mode");
|
int xr_mode_index = p_preset->get("xr_features/xr_mode");
|
||||||
if (xr_mode_index == 1 /* XRMode.OVR */) {
|
if (xr_mode_index == XR_MODE_OVR || xr_mode_index == XR_MODE_OPENXR) {
|
||||||
int hand_tracking_index = p_preset->get("xr_features/hand_tracking"); // 0: none, 1: optional, 2: required
|
int hand_tracking_index = p_preset->get("xr_features/hand_tracking"); // 0: none, 1: optional, 2: required
|
||||||
if (hand_tracking_index > 0) {
|
if (hand_tracking_index > XR_HAND_TRACKING_NONE) {
|
||||||
if (r_permissions.find("com.oculus.permission.HAND_TRACKING") == -1) {
|
if (r_permissions.find("com.oculus.permission.HAND_TRACKING") == -1) {
|
||||||
r_permissions.push_back("com.oculus.permission.HAND_TRACKING");
|
r_permissions.push_back("com.oculus.permission.HAND_TRACKING");
|
||||||
}
|
}
|
||||||
|
@ -976,14 +976,14 @@ void EditorExportPlatformAndroid::_fix_manifest(const Ref<EditorExportPreset> &p
|
||||||
|
|
||||||
if (tname == "meta-data" && attrname == "name" && value == "xr_mode_metadata_name") {
|
if (tname == "meta-data" && attrname == "name" && value == "xr_mode_metadata_name") {
|
||||||
// Update the meta-data 'android:name' attribute based on the selected XR mode.
|
// Update the meta-data 'android:name' attribute based on the selected XR mode.
|
||||||
if (xr_mode_index == 1 /* XRMode.OVR */) {
|
if (xr_mode_index == XR_MODE_OVR || xr_mode_index == XR_MODE_OPENXR) {
|
||||||
string_table.write[attr_value] = "com.samsung.android.vr.application.mode";
|
string_table.write[attr_value] = "com.samsung.android.vr.application.mode";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tname == "meta-data" && attrname == "value" && value == "xr_mode_metadata_value") {
|
if (tname == "meta-data" && attrname == "value" && value == "xr_mode_metadata_value") {
|
||||||
// Update the meta-data 'android:value' attribute based on the selected XR mode.
|
// Update the meta-data 'android:value' attribute based on the selected XR mode.
|
||||||
if (xr_mode_index == 1 /* XRMode.OVR */) {
|
if (xr_mode_index == XR_MODE_OVR || xr_mode_index == XR_MODE_OPENXR) {
|
||||||
string_table.write[attr_value] = "vr_only";
|
string_table.write[attr_value] = "vr_only";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1002,7 +1002,7 @@ void EditorExportPlatformAndroid::_fix_manifest(const Ref<EditorExportPreset> &p
|
||||||
Vector<bool> feature_required_list;
|
Vector<bool> feature_required_list;
|
||||||
Vector<int> feature_versions;
|
Vector<int> feature_versions;
|
||||||
|
|
||||||
if (xr_mode_index == 1 /* XRMode.OVR */) {
|
if (xr_mode_index == XR_MODE_OVR || xr_mode_index == XR_MODE_OPENXR) {
|
||||||
// Set degrees of freedom
|
// Set degrees of freedom
|
||||||
feature_names.push_back("android.hardware.vr.headtracking");
|
feature_names.push_back("android.hardware.vr.headtracking");
|
||||||
feature_required_list.push_back(true);
|
feature_required_list.push_back(true);
|
||||||
|
@ -1010,11 +1010,21 @@ void EditorExportPlatformAndroid::_fix_manifest(const Ref<EditorExportPreset> &p
|
||||||
|
|
||||||
// Check for hand tracking
|
// Check for hand tracking
|
||||||
int hand_tracking_index = p_preset->get("xr_features/hand_tracking"); // 0: none, 1: optional, 2: required
|
int hand_tracking_index = p_preset->get("xr_features/hand_tracking"); // 0: none, 1: optional, 2: required
|
||||||
if (hand_tracking_index > 0) {
|
if (hand_tracking_index > XR_HAND_TRACKING_NONE) {
|
||||||
feature_names.push_back("oculus.software.handtracking");
|
feature_names.push_back("oculus.software.handtracking");
|
||||||
feature_required_list.push_back(hand_tracking_index == 2);
|
feature_required_list.push_back(hand_tracking_index == XR_HAND_TRACKING_REQUIRED);
|
||||||
feature_versions.push_back(-1); // no version attribute should be added.
|
feature_versions.push_back(-1); // no version attribute should be added.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (xr_mode_index == XR_MODE_OPENXR) {
|
||||||
|
// Check for passthrough
|
||||||
|
int passthrough_mode = p_preset->get("xr_features/passthrough");
|
||||||
|
if (passthrough_mode > XR_PASSTHROUGH_NONE) {
|
||||||
|
feature_names.push_back("com.oculus.feature.PASSTHROUGH");
|
||||||
|
feature_required_list.push_back(passthrough_mode == XR_PASSTHROUGH_REQUIRED);
|
||||||
|
feature_versions.push_back(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (feature_names.size() > 0) {
|
if (feature_names.size() > 0) {
|
||||||
|
@ -1693,8 +1703,9 @@ void EditorExportPlatformAndroid::get_export_options(List<ExportOption> *r_optio
|
||||||
|
|
||||||
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "graphics/opengl_debug"), false));
|
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "graphics/opengl_debug"), false));
|
||||||
|
|
||||||
r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "xr_features/xr_mode", PROPERTY_HINT_ENUM, "Regular,Oculus Mobile VR"), 0));
|
r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "xr_features/xr_mode", PROPERTY_HINT_ENUM, "Regular,Oculus Mobile VrApi (Deprecated),OpenXR"), 0));
|
||||||
r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "xr_features/hand_tracking", PROPERTY_HINT_ENUM, "None,Optional,Required"), 0));
|
r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "xr_features/hand_tracking", PROPERTY_HINT_ENUM, "None,Optional,Required"), 0));
|
||||||
|
r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "xr_features/passthrough", PROPERTY_HINT_ENUM, "None,Optional,Required"), 0));
|
||||||
|
|
||||||
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "screen/immersive_mode"), true));
|
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "screen/immersive_mode"), true));
|
||||||
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "screen/support_small"), true));
|
r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "screen/support_small"), true));
|
||||||
|
@ -2183,10 +2194,19 @@ bool EditorExportPlatformAndroid::can_export(const Ref<EditorExportPreset> &p_pr
|
||||||
// Validate the Xr features are properly populated
|
// Validate the Xr features are properly populated
|
||||||
int xr_mode_index = p_preset->get("xr_features/xr_mode");
|
int xr_mode_index = p_preset->get("xr_features/xr_mode");
|
||||||
int hand_tracking = p_preset->get("xr_features/hand_tracking");
|
int hand_tracking = p_preset->get("xr_features/hand_tracking");
|
||||||
if (xr_mode_index != /* XRMode.OVR*/ 1) {
|
int passthrough_mode = p_preset->get("xr_features/passthrough");
|
||||||
if (hand_tracking > 0) {
|
if (xr_mode_index != XR_MODE_OVR && xr_mode_index != XR_MODE_OPENXR) {
|
||||||
|
if (hand_tracking > XR_HAND_TRACKING_NONE) {
|
||||||
valid = false;
|
valid = false;
|
||||||
err += TTR("\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VR\".");
|
err += TTR("\"Hand Tracking\" is only valid when \"Xr Mode\" is \"Oculus Mobile VrApi\" or \"OpenXR\".");
|
||||||
|
err += "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xr_mode_index != XR_MODE_OPENXR) {
|
||||||
|
if (passthrough_mode > XR_PASSTHROUGH_NONE) {
|
||||||
|
valid = false;
|
||||||
|
err += TTR("\"Passthrough\" is only valid when \"Xr Mode\" is \"OpenXR\".");
|
||||||
err += "\n";
|
err += "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2523,8 +2543,10 @@ void EditorExportPlatformAndroid::get_command_line_flags(const Ref<EditorExportP
|
||||||
}
|
}
|
||||||
|
|
||||||
int xr_mode_index = p_preset->get("xr_features/xr_mode");
|
int xr_mode_index = p_preset->get("xr_features/xr_mode");
|
||||||
if (xr_mode_index == 1) {
|
if (xr_mode_index == XR_MODE_OVR) {
|
||||||
command_line_strings.push_back("--xr_mode_ovr");
|
command_line_strings.push_back("--xr_mode_ovr");
|
||||||
|
} else if (xr_mode_index == XR_MODE_OPENXR) {
|
||||||
|
command_line_strings.push_back("--xr_mode_openxr");
|
||||||
} else { // XRMode.REGULAR is the default.
|
} else { // XRMode.REGULAR is the default.
|
||||||
command_line_strings.push_back("--xr_mode_regular");
|
command_line_strings.push_back("--xr_mode_regular");
|
||||||
}
|
}
|
||||||
|
|
|
@ -211,16 +211,24 @@ String _get_screen_sizes_tag(const Ref<EditorExportPreset> &p_preset) {
|
||||||
|
|
||||||
String _get_xr_features_tag(const Ref<EditorExportPreset> &p_preset) {
|
String _get_xr_features_tag(const Ref<EditorExportPreset> &p_preset) {
|
||||||
String manifest_xr_features;
|
String manifest_xr_features;
|
||||||
bool uses_xr = (int)(p_preset->get("xr_features/xr_mode")) == 1;
|
int xr_mode_index = (int)(p_preset->get("xr_features/xr_mode"));
|
||||||
|
bool uses_xr = xr_mode_index == XR_MODE_OVR || xr_mode_index == XR_MODE_OPENXR;
|
||||||
if (uses_xr) {
|
if (uses_xr) {
|
||||||
manifest_xr_features += " <uses-feature tools:node=\"replace\" android:name=\"android.hardware.vr.headtracking\" android:required=\"true\" android:version=\"1\" />\n";
|
manifest_xr_features += " <uses-feature tools:node=\"replace\" android:name=\"android.hardware.vr.headtracking\" android:required=\"true\" android:version=\"1\" />\n";
|
||||||
|
|
||||||
int hand_tracking_index = p_preset->get("xr_features/hand_tracking"); // 0: none, 1: optional, 2: required
|
int hand_tracking_index = p_preset->get("xr_features/hand_tracking"); // 0: none, 1: optional, 2: required
|
||||||
if (hand_tracking_index == 1) {
|
if (hand_tracking_index == XR_HAND_TRACKING_OPTIONAL) {
|
||||||
manifest_xr_features += " <uses-feature tools:node=\"replace\" android:name=\"oculus.software.handtracking\" android:required=\"false\" />\n";
|
manifest_xr_features += " <uses-feature tools:node=\"replace\" android:name=\"oculus.software.handtracking\" android:required=\"false\" />\n";
|
||||||
} else if (hand_tracking_index == 2) {
|
} else if (hand_tracking_index == XR_HAND_TRACKING_REQUIRED) {
|
||||||
manifest_xr_features += " <uses-feature tools:node=\"replace\" android:name=\"oculus.software.handtracking\" android:required=\"true\" />\n";
|
manifest_xr_features += " <uses-feature tools:node=\"replace\" android:name=\"oculus.software.handtracking\" android:required=\"true\" />\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int passthrough_mode = p_preset->get("xr_features/passthrough");
|
||||||
|
if (passthrough_mode == XR_PASSTHROUGH_OPTIONAL) {
|
||||||
|
manifest_xr_features += " <uses-feature tools:node=\"replace\" android:name=\"com.oculus.feature.PASSTHROUGH\" android:required=\"false\" />\n";
|
||||||
|
} else if (passthrough_mode == XR_PASSTHROUGH_REQUIRED) {
|
||||||
|
manifest_xr_features += " <uses-feature tools:node=\"replace\" android:name=\"com.oculus.feature.PASSTHROUGH\" android:required=\"true\" />\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return manifest_xr_features;
|
return manifest_xr_features;
|
||||||
}
|
}
|
||||||
|
@ -239,7 +247,8 @@ String _get_instrumentation_tag(const Ref<EditorExportPreset> &p_preset) {
|
||||||
}
|
}
|
||||||
|
|
||||||
String _get_activity_tag(const Ref<EditorExportPreset> &p_preset) {
|
String _get_activity_tag(const Ref<EditorExportPreset> &p_preset) {
|
||||||
bool uses_xr = (int)(p_preset->get("xr_features/xr_mode")) == 1;
|
int xr_mode_index = (int)(p_preset->get("xr_features/xr_mode"));
|
||||||
|
bool uses_xr = xr_mode_index == XR_MODE_OVR || xr_mode_index == XR_MODE_OPENXR;
|
||||||
String orientation = _get_android_orientation_label(
|
String orientation = _get_android_orientation_label(
|
||||||
OS::get_singleton()->get_screen_orientation_from_string(GLOBAL_GET("display/window/handheld/orientation")));
|
OS::get_singleton()->get_screen_orientation_from_string(GLOBAL_GET("display/window/handheld/orientation")));
|
||||||
String manifest_activity_text = vformat(
|
String manifest_activity_text = vformat(
|
||||||
|
@ -257,7 +266,8 @@ String _get_activity_tag(const Ref<EditorExportPreset> &p_preset) {
|
||||||
}
|
}
|
||||||
|
|
||||||
String _get_application_tag(const Ref<EditorExportPreset> &p_preset, bool p_has_storage_permission) {
|
String _get_application_tag(const Ref<EditorExportPreset> &p_preset, bool p_has_storage_permission) {
|
||||||
bool uses_xr = (int)(p_preset->get("xr_features/xr_mode")) == 1;
|
int xr_mode_index = (int)(p_preset->get("xr_features/xr_mode"));
|
||||||
|
bool uses_xr = xr_mode_index == XR_MODE_OVR || xr_mode_index == XR_MODE_OPENXR;
|
||||||
String manifest_application_text = vformat(
|
String manifest_application_text = vformat(
|
||||||
" <application android:label=\"@string/godot_project_name_string\"\n"
|
" <application android:label=\"@string/godot_project_name_string\"\n"
|
||||||
" android:allowBackup=\"%s\"\n"
|
" android:allowBackup=\"%s\"\n"
|
||||||
|
|
|
@ -44,6 +44,22 @@ const String godot_project_name_xml_string = R"(<?xml version="1.0" encoding="ut
|
||||||
</resources>
|
</resources>
|
||||||
)";
|
)";
|
||||||
|
|
||||||
|
// Supported XR modes.
|
||||||
|
// This should match the entries in 'platform/android/java/lib/src/org/godotengine/godot/xr/XRMode.java'
|
||||||
|
static const int XR_MODE_REGULAR = 0;
|
||||||
|
static const int XR_MODE_OVR = 1;
|
||||||
|
static const int XR_MODE_OPENXR = 2;
|
||||||
|
|
||||||
|
// Supported XR hand tracking modes.
|
||||||
|
static const int XR_HAND_TRACKING_NONE = 0;
|
||||||
|
static const int XR_HAND_TRACKING_OPTIONAL = 1;
|
||||||
|
static const int XR_HAND_TRACKING_REQUIRED = 2;
|
||||||
|
|
||||||
|
// Supported XR passthrough modes.
|
||||||
|
static const int XR_PASSTHROUGH_NONE = 0;
|
||||||
|
static const int XR_PASSTHROUGH_OPTIONAL = 1;
|
||||||
|
static const int XR_PASSTHROUGH_REQUIRED = 2;
|
||||||
|
|
||||||
struct CustomExportData {
|
struct CustomExportData {
|
||||||
String assets_directory;
|
String assets_directory;
|
||||||
bool debug;
|
bool debug;
|
||||||
|
|
|
@ -620,6 +620,8 @@ public class Godot extends Fragment implements SensorEventListener, IDownloaderC
|
||||||
xrMode = XRMode.REGULAR;
|
xrMode = XRMode.REGULAR;
|
||||||
} else if (command_line[i].equals(XRMode.OVR.cmdLineArg)) {
|
} else if (command_line[i].equals(XRMode.OVR.cmdLineArg)) {
|
||||||
xrMode = XRMode.OVR;
|
xrMode = XRMode.OVR;
|
||||||
|
} else if (command_line[i].equals(XRMode.OPENXR.cmdLineArg)) {
|
||||||
|
xrMode = XRMode.OPENXR;
|
||||||
} else if (command_line[i].equals("--debug_opengl")) {
|
} else if (command_line[i].equals("--debug_opengl")) {
|
||||||
use_debug_opengl = true;
|
use_debug_opengl = true;
|
||||||
} else if (command_line[i].equals("--translucent")) {
|
} else if (command_line[i].equals("--translucent")) {
|
||||||
|
|
|
@ -128,6 +128,7 @@ public class GodotView extends GLSurfaceView {
|
||||||
setFocusableInTouchMode(true);
|
setFocusableInTouchMode(true);
|
||||||
switch (xrMode) {
|
switch (xrMode) {
|
||||||
case OVR:
|
case OVR:
|
||||||
|
case OPENXR:
|
||||||
// Replace the default egl config chooser.
|
// Replace the default egl config chooser.
|
||||||
eglConfigChooser = new OvrConfigChooser();
|
eglConfigChooser = new OvrConfigChooser();
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,8 @@ package org.godotengine.godot.xr;
|
||||||
*/
|
*/
|
||||||
public enum XRMode {
|
public enum XRMode {
|
||||||
REGULAR(0, "Regular", "--xr_mode_regular", "Default Android Gamepad"), // Regular/flatscreen
|
REGULAR(0, "Regular", "--xr_mode_regular", "Default Android Gamepad"), // Regular/flatscreen
|
||||||
OVR(1, "Oculus Mobile VR", "--xr_mode_ovr", "");
|
OVR(1, "Oculus Mobile VrApi (Deprecated)", "--xr_mode_ovr", ""),
|
||||||
|
OPENXR(2, "OpenXR", "--xr_mode_openxr", "");
|
||||||
|
|
||||||
final int index;
|
final int index;
|
||||||
final String label;
|
final String label;
|
||||||
|
|
Loading…
Reference in a new issue