43 lines
1.2 KiB
C++
43 lines
1.2 KiB
C++
#include "ydi_vr_origin.h"
|
|
#include "core/config/engine.h"
|
|
#include "scene/main/viewport.h"
|
|
#include "servers/xr/xr_interface.h"
|
|
#include "servers/xr_server.h"
|
|
|
|
void VROrigin::_bind_methods() {}
|
|
|
|
void VROrigin::setup_vr_interface(Ref<XRInterface> with_interface) {
|
|
if (with_interface.is_valid()) {
|
|
DisplayServer::get_singleton()->window_set_vsync_mode(DisplayServer::VSYNC_DISABLED);
|
|
get_viewport()->set_use_xr(true);
|
|
}
|
|
}
|
|
|
|
void VROrigin::on_xr_interface_added(StringName interface) {
|
|
if (interface == "OpenXR") {
|
|
setup_vr_interface(XRServer::get_singleton()->find_interface(interface));
|
|
XRServer::get_singleton()->disconnect("interface_added", callable_mp(this, &self_type::on_xr_interface_added));
|
|
}
|
|
}
|
|
|
|
void VROrigin::enter_tree() {
|
|
Ref<XRInterface> xrint{ XRServer::get_singleton()->find_interface("OpenXR") };
|
|
if (xrint.is_valid()) {
|
|
setup_vr_interface(xrint);
|
|
} else {
|
|
XRServer::get_singleton()->connect("interface_added", callable_mp(this, &self_type::on_xr_interface_added));
|
|
}
|
|
}
|
|
|
|
void VROrigin::_notification(int what) {
|
|
if (Engine::get_singleton()->is_editor_hint()) {
|
|
return;
|
|
}
|
|
switch (what) {
|
|
case NOTIFICATION_ENTER_TREE:
|
|
enter_tree();
|
|
return;
|
|
default:
|
|
return;
|
|
}
|
|
}
|