summaryrefslogtreecommitdiffstats
path: root/modules/webxr/register_types.cpp
diff options
context:
space:
mode:
authorBastiaan Olij <mux213@gmail.com>2021-09-28 12:15:00 +1000
committerBastiaan Olij <mux213@gmail.com>2021-09-28 12:25:15 +1000
commit0623d3676bd86a5eb4319b273642ad0504a49c33 (patch)
tree2a8c7497be42989b5183e5270c64a4ac9df4b646 /modules/webxr/register_types.cpp
parent4f4f73b82fe00169f8776f3e41966abdb5c60349 (diff)
downloadredot-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/webxr/register_types.cpp')
-rw-r--r--modules/webxr/register_types.cpp21
1 files changed, 20 insertions, 1 deletions
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
}