summaryrefslogtreecommitdiffstats
path: root/modules/openxr/scene
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2024-04-08 11:21:05 +0200
committerRémi Verschelde <rverschelde@gmail.com>2024-04-08 11:21:05 +0200
commit59cfa0ef75b038a30f91df0817a27f46b3f3fd46 (patch)
treeef78b2148a2c22612d2b0eb4acc355b9fbb7e368 /modules/openxr/scene
parentcedf4ad0111a2b7dfe6326ff53a90640f6778b85 (diff)
parentfddf6dc65157fe08bdda20809a105950f885a095 (diff)
downloadredot-engine-59cfa0ef75b038a30f91df0817a27f46b3f3fd46.tar.gz
Merge pull request #90237 from dsnopek/openxr-composition-layers-extension-properties
Allow OpenXR extensions to add properties to the OpenXRCompositionLayer node
Diffstat (limited to 'modules/openxr/scene')
-rw-r--r--modules/openxr/scene/openxr_composition_layer.cpp46
-rw-r--r--modules/openxr/scene/openxr_composition_layer.h5
2 files changed, 49 insertions, 2 deletions
diff --git a/modules/openxr/scene/openxr_composition_layer.cpp b/modules/openxr/scene/openxr_composition_layer.cpp
index 120914485f..e0d0ddc77f 100644
--- a/modules/openxr/scene/openxr_composition_layer.cpp
+++ b/modules/openxr/scene/openxr_composition_layer.cpp
@@ -236,6 +236,14 @@ void OpenXRCompositionLayer::_reset_fallback_material() {
void OpenXRCompositionLayer::_notification(int p_what) {
switch (p_what) {
+ case NOTIFICATION_POSTINITIALIZE: {
+ if (openxr_layer_provider) {
+ for (OpenXRExtensionWrapper *extension : OpenXRAPI::get_registered_extension_wrappers()) {
+ extension_property_values.merge(extension->get_viewport_composition_layer_extension_property_defaults());
+ }
+ openxr_layer_provider->set_extension_property_values(extension_property_values);
+ }
+ } break;
case NOTIFICATION_INTERNAL_PROCESS: {
if (fallback) {
if (should_update_fallback_mesh) {
@@ -260,7 +268,7 @@ void OpenXRCompositionLayer::_notification(int p_what) {
} break;
case NOTIFICATION_ENTER_TREE: {
if (composition_layer_extension) {
- composition_layer_extension->register_composition_layer_provider(openxr_layer_provider);
+ composition_layer_extension->register_viewport_composition_layer_provider(openxr_layer_provider);
}
if (!fallback && layer_viewport && openxr_api && openxr_api->is_running() && is_visible()) {
@@ -269,7 +277,7 @@ void OpenXRCompositionLayer::_notification(int p_what) {
} break;
case NOTIFICATION_EXIT_TREE: {
if (composition_layer_extension) {
- composition_layer_extension->unregister_composition_layer_provider(openxr_layer_provider);
+ composition_layer_extension->unregister_viewport_composition_layer_provider(openxr_layer_provider);
}
// When a node is removed in the editor, we need to clear the layer viewport, because otherwise
@@ -285,6 +293,40 @@ void OpenXRCompositionLayer::_notification(int p_what) {
}
}
+void OpenXRCompositionLayer::_get_property_list(List<PropertyInfo> *p_property_list) const {
+ List<PropertyInfo> extension_properties;
+ for (OpenXRExtensionWrapper *extension : OpenXRAPI::get_registered_extension_wrappers()) {
+ extension->get_viewport_composition_layer_extension_properties(&extension_properties);
+ }
+
+ for (const PropertyInfo &pinfo : extension_properties) {
+ StringName prop_name = pinfo.name;
+ if (!String(prop_name).contains("/")) {
+ WARN_PRINT_ONCE(vformat("Discarding OpenXRCompositionLayer property name '%s' from extension because it doesn't contain a '/'."));
+ continue;
+ }
+ p_property_list->push_back(pinfo);
+ }
+}
+
+bool OpenXRCompositionLayer::_get(const StringName &p_property, Variant &r_value) const {
+ if (extension_property_values.has(p_property)) {
+ r_value = extension_property_values[p_property];
+ }
+
+ return true;
+}
+
+bool OpenXRCompositionLayer::_set(const StringName &p_property, const Variant &p_value) {
+ extension_property_values[p_property] = p_value;
+
+ if (openxr_layer_provider) {
+ openxr_layer_provider->set_extension_property_values(extension_property_values);
+ }
+
+ return true;
+}
+
PackedStringArray OpenXRCompositionLayer::get_configuration_warnings() const {
PackedStringArray warnings = Node3D::get_configuration_warnings();
diff --git a/modules/openxr/scene/openxr_composition_layer.h b/modules/openxr/scene/openxr_composition_layer.h
index f683aea647..dbc09d19b1 100644
--- a/modules/openxr/scene/openxr_composition_layer.h
+++ b/modules/openxr/scene/openxr_composition_layer.h
@@ -49,6 +49,8 @@ class OpenXRCompositionLayer : public Node3D {
MeshInstance3D *fallback = nullptr;
bool should_update_fallback_mesh = false;
+ Dictionary extension_property_values;
+
void _create_fallback_node();
void _reset_fallback_material();
@@ -60,6 +62,9 @@ protected:
static void _bind_methods();
void _notification(int p_what);
+ void _get_property_list(List<PropertyInfo> *p_property_list) const;
+ bool _get(const StringName &p_property, Variant &r_value) const;
+ bool _set(const StringName &p_property, const Variant &p_value);
virtual void _on_openxr_session_begun();
virtual void _on_openxr_session_stopping();