Browse Source

Add support for configuring the xr hand tracking frequency mode

ne0fhyk 3 years ago
parent
commit
9d22ad3c9b

+ 18 - 4
platform/android/export/export_plugin.cpp

@@ -838,6 +838,8 @@ void EditorExportPlatformAndroid::_fix_manifest(const Ref<EditorExportPreset> &p
 	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("xr_features/xr_mode");
 	int xr_mode_index = p_preset->get("xr_features/xr_mode");
+	int hand_tracking_index = p_preset->get("xr_features/hand_tracking");
+	int hand_tracking_frequency_index = p_preset->get("xr_features/hand_tracking_frequency");
 
 
 	bool backup_allowed = p_preset->get("user_data_backup/allow");
 	bool backup_allowed = p_preset->get("user_data_backup/allow");
 	bool classify_as_game = p_preset->get("package/classify_as_game");
 	bool classify_as_game = p_preset->get("package/classify_as_game");
@@ -988,6 +990,18 @@ void EditorExportPlatformAndroid::_fix_manifest(const Ref<EditorExportPreset> &p
 						}
 						}
 					}
 					}
 
 
+					if (tname == "meta-data" && attrname == "name" && value == "xr_hand_tracking_metadata_name") {
+						if ((xr_mode_index == XR_MODE_OVR || xr_mode_index == XR_MODE_OPENXR) && hand_tracking_index > XR_HAND_TRACKING_NONE) {
+							string_table.write[attr_value] = "com.oculus.handtracking.frequency";
+						}
+					}
+
+					if (tname == "meta-data" && attrname == "value" && value == "xr_hand_tracking_metadata_value") {
+						if ((xr_mode_index == XR_MODE_OVR || xr_mode_index == XR_MODE_OPENXR) && hand_tracking_index > XR_HAND_TRACKING_NONE) {
+							string_table.write[attr_value] = (hand_tracking_frequency_index == XR_HAND_TRACKING_FREQUENCY_LOW ? "LOW" : "HIGH");
+						}
+					}
+
 					iofs += 20;
 					iofs += 20;
 				}
 				}
 
 
@@ -1009,7 +1023,6 @@ void EditorExportPlatformAndroid::_fix_manifest(const Ref<EditorExportPreset> &p
 						feature_versions.push_back(1);
 						feature_versions.push_back(1);
 
 
 						// 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
 						if (hand_tracking_index > XR_HAND_TRACKING_NONE) {
 						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 == XR_HAND_TRACKING_REQUIRED);
 							feature_required_list.push_back(hand_tracking_index == XR_HAND_TRACKING_REQUIRED);
@@ -1703,9 +1716,10 @@ 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 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/passthrough", PROPERTY_HINT_ENUM, "None,Optional,Required"), 0));
+	r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "xr_features/xr_mode", PROPERTY_HINT_ENUM, "Regular,Oculus Mobile VrApi (Deprecated),OpenXR"), XR_MODE_REGULAR));
+	r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "xr_features/hand_tracking", PROPERTY_HINT_ENUM, "None,Optional,Required"), XR_HAND_TRACKING_NONE));
+	r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "xr_features/hand_tracking_frequency", PROPERTY_HINT_ENUM, "Low,High"), XR_HAND_TRACKING_FREQUENCY_LOW));
+	r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "xr_features/passthrough", PROPERTY_HINT_ENUM, "None,Optional,Required"), XR_PASSTHROUGH_NONE));
 
 
 	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));

+ 11 - 1
platform/android/export/gradle_export_util.cpp

@@ -277,7 +277,8 @@ String _get_application_tag(const Ref<EditorExportPreset> &p_preset, bool p_has_
 			"        tools:replace=\"android:allowBackup,android:isGame,android:hasFragileUserData,android:requestLegacyExternalStorage\"\n"
 			"        tools:replace=\"android:allowBackup,android:isGame,android:hasFragileUserData,android:requestLegacyExternalStorage\"\n"
 			"        tools:ignore=\"GoogleAppIndexingWarning\"\n"
 			"        tools:ignore=\"GoogleAppIndexingWarning\"\n"
 			"        android:icon=\"@mipmap/icon\" >\n\n"
 			"        android:icon=\"@mipmap/icon\" >\n\n"
-			"        <meta-data tools:node=\"remove\" android:name=\"xr_mode_metadata_name\" />\n",
+			"        <meta-data tools:node=\"remove\" android:name=\"xr_mode_metadata_name\" />\n"
+			"        <meta-data tools:node=\"remove\" android:name=\"xr_hand_tracking_metadata_name\" />\n",
 			bool_to_string(p_preset->get("user_data_backup/allow")),
 			bool_to_string(p_preset->get("user_data_backup/allow")),
 			bool_to_string(p_preset->get("package/classify_as_game")),
 			bool_to_string(p_preset->get("package/classify_as_game")),
 			bool_to_string(p_preset->get("package/retain_data_on_uninstall")),
 			bool_to_string(p_preset->get("package/retain_data_on_uninstall")),
@@ -285,6 +286,15 @@ String _get_application_tag(const Ref<EditorExportPreset> &p_preset, bool p_has_
 
 
 	if (uses_xr) {
 	if (uses_xr) {
 		manifest_application_text += "        <meta-data tools:node=\"replace\" android:name=\"com.samsung.android.vr.application.mode\" android:value=\"vr_only\" />\n";
 		manifest_application_text += "        <meta-data tools:node=\"replace\" android:name=\"com.samsung.android.vr.application.mode\" android:value=\"vr_only\" />\n";
+
+		bool hand_tracking_enabled = (int)(p_preset->get("xr_features/hand_tracking")) > XR_HAND_TRACKING_NONE;
+		if (hand_tracking_enabled) {
+			int hand_tracking_frequency_index = p_preset->get("xr_features/hand_tracking_frequency");
+			String hand_tracking_frequency = hand_tracking_frequency_index == XR_HAND_TRACKING_FREQUENCY_LOW ? "LOW" : "HIGH";
+			manifest_application_text += vformat(
+					"        <meta-data tools:node=\"replace\" android:name=\"com.oculus.handtracking.frequency\" android:value=\"%s\" />\n",
+					hand_tracking_frequency);
+		}
 	}
 	}
 	manifest_application_text += _get_activity_tag(p_preset);
 	manifest_application_text += _get_activity_tag(p_preset);
 	manifest_application_text += "    </application>\n";
 	manifest_application_text += "    </application>\n";

+ 4 - 0
platform/android/export/gradle_export_util.h

@@ -55,6 +55,10 @@ static const int XR_HAND_TRACKING_NONE = 0;
 static const int XR_HAND_TRACKING_OPTIONAL = 1;
 static const int XR_HAND_TRACKING_OPTIONAL = 1;
 static const int XR_HAND_TRACKING_REQUIRED = 2;
 static const int XR_HAND_TRACKING_REQUIRED = 2;
 
 
+// Supported XR hand tracking frequencies.
+static const int XR_HAND_TRACKING_FREQUENCY_LOW = 0;
+static const int XR_HAND_TRACKING_FREQUENCY_HIGH = 1;
+
 // Supported XR passthrough modes.
 // Supported XR passthrough modes.
 static const int XR_PASSTHROUGH_NONE = 0;
 static const int XR_PASSTHROUGH_NONE = 0;
 static const int XR_PASSTHROUGH_OPTIONAL = 1;
 static const int XR_PASSTHROUGH_OPTIONAL = 1;

+ 7 - 0
platform/android/java/app/AndroidManifest.xml

@@ -43,6 +43,13 @@
             android:name="xr_mode_metadata_name"
             android:name="xr_mode_metadata_name"
             android:value="xr_mode_metadata_value" />
             android:value="xr_mode_metadata_value" />
 
 
+        <!-- XR hand tracking metadata -->
+        <!-- This is modified by the exporter based on the selected xr mode. DO NOT CHANGE the values here. -->
+        <!-- Removed at export time if the xr mode is not VR or hand tracking is disabled. -->
+        <meta-data
+            android:name="xr_hand_tracking_metadata_name"
+            android:value="xr_hand_tracking_metadata_value"/>
+
         <activity
         <activity
             android:name=".GodotApp"
             android:name=".GodotApp"
             android:label="@string/godot_project_name_string"
             android:label="@string/godot_project_name_string"