diff options
author | Bastiaan Olij <mux213@gmail.com> | 2021-09-28 12:15:00 +1000 |
---|---|---|
committer | Bastiaan Olij <mux213@gmail.com> | 2021-09-28 12:25:15 +1000 |
commit | 0623d3676bd86a5eb4319b273642ad0504a49c33 (patch) | |
tree | 2a8c7497be42989b5183e5270c64a4ac9df4b646 /modules | |
parent | 4f4f73b82fe00169f8776f3e41966abdb5c60349 (diff) | |
download | redot-engine-0623d3676bd86a5eb4319b273642ad0504a49c33.tar.gz |
Improve unregistering XR interfaces so we don't get crashes in GDExtensions by destroying the XRServer too early
Diffstat (limited to 'modules')
-rw-r--r-- | modules/mobile_vr/register_types.cpp | 17 | ||||
-rw-r--r-- | modules/webxr/register_types.cpp | 21 |
2 files changed, 36 insertions, 2 deletions
diff --git a/modules/mobile_vr/register_types.cpp b/modules/mobile_vr/register_types.cpp index 47d1fe482c..233c16531a 100644 --- a/modules/mobile_vr/register_types.cpp +++ b/modules/mobile_vr/register_types.cpp @@ -32,15 +32,30 @@ #include "mobile_vr_interface.h" +Ref<MobileVRInterface> mobile_vr; + void register_mobile_vr_types() { GDREGISTER_CLASS(MobileVRInterface); if (XRServer::get_singleton()) { - Ref<MobileVRInterface> mobile_vr; mobile_vr.instantiate(); XRServer::get_singleton()->add_interface(mobile_vr); } } void unregister_mobile_vr_types() { + if (mobile_vr.is_valid()) { + // uninitialise our interface if it is initialised + if (mobile_vr->is_initialized()) { + mobile_vr->uninitialize(); + } + + // unregister our interface from the XR server + if (XRServer::get_singleton()) { + XRServer::get_singleton()->remove_interface(mobile_vr); + } + + // and release + mobile_vr.unref(); + } } diff --git a/modules/webxr/register_types.cpp b/modules/webxr/register_types.cpp index 078a6547cf..16b483c39e 100644 --- a/modules/webxr/register_types.cpp +++ b/modules/webxr/register_types.cpp @@ -33,15 +33,34 @@ #include "webxr_interface.h" #include "webxr_interface_js.h" +#ifdef JAVASCRIPT_ENABLED +Ref<WebXRInterfaceJS> webxr; +#endif + void register_webxr_types() { GDREGISTER_VIRTUAL_CLASS(WebXRInterface); #ifdef JAVASCRIPT_ENABLED - Ref<WebXRInterfaceJS> webxr; webxr.instantiate(); XRServer::get_singleton()->add_interface(webxr); #endif } void unregister_webxr_types() { +#ifdef JAVASCRIPT_ENABLED + if (webxr.is_valid()) { + // uninitialise our interface if it is initialised + if (webxr->is_initialized()) { + webxr->uninitialize(); + } + + // unregister our interface from the XR server + if (XRServer::get_singleton()) { + XRServer::get_singleton()->remove_interface(webxr); + } + + // and release + webxr.unref(); + } +#endif } |