diff options
Diffstat (limited to 'modules/openxr/openxr_api.cpp')
-rw-r--r-- | modules/openxr/openxr_api.cpp | 108 |
1 files changed, 85 insertions, 23 deletions
diff --git a/modules/openxr/openxr_api.cpp b/modules/openxr/openxr_api.cpp index 17f1c3940c..1f1c7e4ee0 100644 --- a/modules/openxr/openxr_api.cpp +++ b/modules/openxr/openxr_api.cpp @@ -300,32 +300,31 @@ bool OpenXRAPI::create_instance() { for (OpenXRExtensionWrapper *wrapper : registered_extension_wrappers) { const HashMap<String, bool *> &wrapper_request_extensions = wrapper->get_requested_extensions(); - // requested_extensions.insert(wrapper_request_extensions.begin(), wrapper_request_extensions.end()); - for (auto &requested_extension : wrapper_request_extensions) { + for (const KeyValue<String, bool *> &requested_extension : wrapper_request_extensions) { requested_extensions[requested_extension.key] = requested_extension.value; } } - // Check which extensions are supported + // Check which extensions are supported. enabled_extensions.clear(); - for (auto &requested_extension : requested_extensions) { + for (KeyValue<String, bool *> &requested_extension : requested_extensions) { if (!is_extension_supported(requested_extension.key)) { if (requested_extension.value == nullptr) { - // nullptr means this is a manditory extension so we fail + // Null means this is a manditory extension so we fail. ERR_FAIL_V_MSG(false, String("OpenXR: OpenXR Runtime does not support ") + requested_extension.key + String(" extension!")); } else { - // set this extension as not supported + // Set this extension as not supported. *requested_extension.value = false; } } else if (requested_extension.value != nullptr) { - // set this extension as supported + // Set this extension as supported. *requested_extension.value = true; - // and record that we want to enable it + // And record that we want to enable it. enabled_extensions.push_back(requested_extension.key.ascii()); } else { - // record that we want to enable this + // Record that we want to enable this. enabled_extensions.push_back(requested_extension.key.ascii()); } } @@ -482,11 +481,19 @@ bool OpenXRAPI::load_supported_view_configuration_types() { result = xrEnumerateViewConfigurations(instance, system_id, num_view_configuration_types, &num_view_configuration_types, supported_view_configuration_types); ERR_FAIL_COND_V_MSG(XR_FAILED(result), false, "OpenXR: Failed to enumerateview configurations"); + ERR_FAIL_COND_V_MSG(num_view_configuration_types == 0, false, "OpenXR: Failed to enumerateview configurations"); // JIC there should be at least 1! for (uint32_t i = 0; i < num_view_configuration_types; i++) { print_verbose(String("OpenXR: Found supported view configuration ") + OpenXRUtil::get_view_configuration_name(supported_view_configuration_types[i])); } + // Check value we loaded at startup... + if (!is_view_configuration_supported(view_configuration)) { + print_verbose(String("OpenXR: ") + OpenXRUtil::get_view_configuration_name(view_configuration) + String(" isn't supported, defaulting to ") + OpenXRUtil::get_view_configuration_name(supported_view_configuration_types[0])); + + view_configuration = supported_view_configuration_types[0]; + } + return true; } @@ -513,11 +520,19 @@ bool OpenXRAPI::load_supported_environmental_blend_modes() { result = xrEnumerateEnvironmentBlendModes(instance, system_id, view_configuration, num_supported_environment_blend_modes, &num_supported_environment_blend_modes, supported_environment_blend_modes); ERR_FAIL_COND_V_MSG(XR_FAILED(result), false, "OpenXR: Failed to enumerate environmental blend modes"); + ERR_FAIL_COND_V_MSG(num_supported_environment_blend_modes == 0, false, "OpenXR: Failed to enumerate environmental blend modes"); // JIC there should be at least 1! for (uint32_t i = 0; i < num_supported_environment_blend_modes; i++) { print_verbose(String("OpenXR: Found environmental blend mode ") + OpenXRUtil::get_environment_blend_mode_name(supported_environment_blend_modes[i])); } + // Check value we loaded at startup... + if (!is_environment_blend_mode_supported(environment_blend_mode)) { + print_verbose(String("OpenXR: ") + OpenXRUtil::get_environment_blend_mode_name(environment_blend_mode) + String(" isn't supported, defaulting to ") + OpenXRUtil::get_environment_blend_mode_name(supported_environment_blend_modes[0])); + + environment_blend_mode = supported_environment_blend_modes[0]; + } + return true; } @@ -666,11 +681,19 @@ bool OpenXRAPI::load_supported_reference_spaces() { result = xrEnumerateReferenceSpaces(session, num_reference_spaces, &num_reference_spaces, supported_reference_spaces); ERR_FAIL_COND_V_MSG(XR_FAILED(result), false, "OpenXR: Failed to enumerate reference spaces"); + ERR_FAIL_COND_V_MSG(num_reference_spaces == 0, false, "OpenXR: Failed to enumerate reference spaces"); for (uint32_t i = 0; i < num_reference_spaces; i++) { print_verbose(String("OpenXR: Found supported reference space ") + OpenXRUtil::get_reference_space_name(supported_reference_spaces[i])); } + // Check value we loaded at startup... + if (!is_reference_space_supported(reference_space)) { + print_verbose(String("OpenXR: ") + OpenXRUtil::get_reference_space_name(reference_space) + String(" isn't supported, defaulting to ") + OpenXRUtil::get_reference_space_name(supported_reference_spaces[0])); + + reference_space = supported_reference_spaces[0]; + } + return true; } @@ -1435,7 +1458,9 @@ Size2 OpenXRAPI::get_recommended_target_size() { XRPose::TrackingConfidence OpenXRAPI::get_head_center(Transform3D &r_transform, Vector3 &r_linear_velocity, Vector3 &r_angular_velocity) { XrResult result; - ERR_FAIL_COND_V(!running, XRPose::XR_TRACKING_CONFIDENCE_NONE); + if (!running) { + return XRPose::XR_TRACKING_CONFIDENCE_NONE; + } // xrWaitFrame not run yet if (frame_state.predictedDisplayTime == 0) { @@ -1488,7 +1513,9 @@ XRPose::TrackingConfidence OpenXRAPI::get_head_center(Transform3D &r_transform, } bool OpenXRAPI::get_view_transform(uint32_t p_view, Transform3D &r_transform) { - ERR_FAIL_COND_V(!running, false); + if (!running) { + return false; + } // xrWaitFrame not run yet if (frame_state.predictedDisplayTime == 0) { @@ -1507,9 +1534,12 @@ bool OpenXRAPI::get_view_transform(uint32_t p_view, Transform3D &r_transform) { } bool OpenXRAPI::get_view_projection(uint32_t p_view, double p_z_near, double p_z_far, Projection &p_camera_matrix) { - ERR_FAIL_COND_V(!running, false); ERR_FAIL_NULL_V(graphics_extension, false); + if (!running) { + return false; + } + // xrWaitFrame not run yet if (frame_state.predictedDisplayTime == 0) { return false; @@ -1918,10 +1948,15 @@ void OpenXRAPI::end_frame() { } } + XrCompositionLayerFlags layer_flags = XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT; + if (layers_list.size() > 0 || environment_blend_mode != XR_ENVIRONMENT_BLEND_MODE_OPAQUE) { + layer_flags |= XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT; + } + XrCompositionLayerProjection projection_layer = { XR_TYPE_COMPOSITION_LAYER_PROJECTION, // type nullptr, // next - layers_list.size() > 0 ? XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT | XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT : XR_COMPOSITION_LAYER_CORRECT_CHROMATIC_ABERRATION_BIT, // layerFlags + layer_flags, // layerFlags play_space, // space view_count, // viewCount projection_views, // views @@ -1985,8 +2020,8 @@ OpenXRAPI::OpenXRAPI() { } else { // Load settings from project settings - int ff = GLOBAL_GET("xr/openxr/form_factor"); - switch (ff) { + int form_factor_setting = GLOBAL_GET("xr/openxr/form_factor"); + switch (form_factor_setting) { case 0: { form_factor = XR_FORM_FACTOR_HEAD_MOUNTED_DISPLAY; } break; @@ -1997,8 +2032,8 @@ OpenXRAPI::OpenXRAPI() { break; } - int vc = GLOBAL_GET("xr/openxr/view_configuration"); - switch (vc) { + int view_configuration_setting = GLOBAL_GET("xr/openxr/view_configuration"); + switch (view_configuration_setting) { case 0: { view_configuration = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_MONO; } break; @@ -2017,8 +2052,8 @@ OpenXRAPI::OpenXRAPI() { break; } - int rs = GLOBAL_GET("xr/openxr/reference_space"); - switch (rs) { + int reference_space_setting = GLOBAL_GET("xr/openxr/reference_space"); + switch (reference_space_setting) { case 0: { reference_space = XR_REFERENCE_SPACE_TYPE_LOCAL; } break; @@ -2029,6 +2064,21 @@ OpenXRAPI::OpenXRAPI() { break; } + int environment_blend_mode_setting = GLOBAL_GET("xr/openxr/environment_blend_mode"); + switch (environment_blend_mode_setting) { + case 0: { + environment_blend_mode = XR_ENVIRONMENT_BLEND_MODE_OPAQUE; + } break; + case 1: { + environment_blend_mode = XR_ENVIRONMENT_BLEND_MODE_ADDITIVE; + } break; + case 2: { + environment_blend_mode = XR_ENVIRONMENT_BLEND_MODE_ALPHA_BLEND; + } break; + default: + break; + } + submit_depth_buffer = GLOBAL_GET("xr/openxr/submit_depth_buffer"); } @@ -2077,7 +2127,7 @@ XRPose::TrackingConfidence _transform_from_location(const T &p_location, Transfo Basis basis; Vector3 origin; XRPose::TrackingConfidence confidence = XRPose::XR_TRACKING_CONFIDENCE_NONE; - const auto &pose = p_location.pose; + const XrPosef &pose = p_location.pose; // Check orientation if (p_location.locationFlags & XR_SPACE_LOCATION_ORIENTATION_VALID_BIT) { @@ -2858,12 +2908,24 @@ const XrEnvironmentBlendMode *OpenXRAPI::get_supported_environment_blend_modes(u return supported_environment_blend_modes; } -bool OpenXRAPI::set_environment_blend_mode(XrEnvironmentBlendMode mode) { +bool OpenXRAPI::is_environment_blend_mode_supported(XrEnvironmentBlendMode p_blend_mode) const { + ERR_FAIL_NULL_V(supported_environment_blend_modes, false); + for (uint32_t i = 0; i < num_supported_environment_blend_modes; i++) { - if (supported_environment_blend_modes[i] == mode) { - environment_blend_mode = mode; + if (supported_environment_blend_modes[i] == p_blend_mode) { return true; } } + + return false; +} + +bool OpenXRAPI::set_environment_blend_mode(XrEnvironmentBlendMode p_blend_mode) { + // We allow setting this when not initialized and will check if it is supported when initializing. + // After OpenXR is initialized we verify we're setting a supported blend mode. + if (!is_initialized() || is_environment_blend_mode_supported(p_blend_mode)) { + environment_blend_mode = p_blend_mode; + return true; + } return false; } |