feat: added VROrigin node

This commit is contained in:
Sara Gerretsen 2025-10-14 22:46:20 +02:00
parent 99ad06d2ae
commit 4cb2b334ab
6 changed files with 80 additions and 5 deletions

View file

@ -3,6 +3,7 @@
#include "client_node.h"
#include "server_node.h"
#include "ydi_networking.h"
#include "ydi_vr_origin.h"
#include <core/object/class_db.h>
void initialize_you_done_it_module(ModuleInitializationLevel p_level) {
@ -12,6 +13,7 @@ void initialize_you_done_it_module(ModuleInitializationLevel p_level) {
ClassDB::register_class<ServerNode>();
ClassDB::register_class<ClientNode>();
ClassDB::register_abstract_class<NetworkData>();
ClassDB::register_class<VROrigin>();
}
void uninitialize_you_done_it_module(ModuleInitializationLevel p_level) {

View file

@ -0,0 +1,43 @@
#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::start_vr(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") {
start_vr(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()) {
start_vr(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;
}
}

View file

@ -0,0 +1,17 @@
#pragma once
#include <scene/3d/xr/xr_nodes.h>
#include <servers/xr/xr_interface.h>
class VROrigin : public XROrigin3D {
GDCLASS(VROrigin, XROrigin3D);
static void _bind_methods();
private:
void start_vr(Ref<XRInterface> with_interface);
void on_xr_interface_added(StringName interface);
void enter_tree();
protected:
void _notification(int what);
};

View file

@ -11,6 +11,7 @@ config_version=5
[application]
config/name="you_done_it"
run/main_scene="uid://b5m5h30gog3pu"
config/features=PackedStringArray("4.5", "Forward Plus")
config/icon="res://icon.svg"

View file

@ -28,6 +28,9 @@ glow_enabled = true
[node name="Root" type="Node3D"]
[node name="VROrigin" parent="." instance=ExtResource("2_onqr8")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0004169941, 0, -0.95417106)
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_bw6k5")
@ -48,8 +51,5 @@ directional_shadow_mode = 0
directional_shadow_fade_start = 0.965
directional_shadow_max_distance = 20.0
[node name="XROrigin3D" parent="." instance=ExtResource("2_onqr8")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0004169941, 0, -0.95417106)
[node name="Block Out VR" parent="." instance=ExtResource("1_w5aja")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.27989578, 0, 1.4924412)

View file

@ -1,13 +1,25 @@
[gd_scene format=3 uid="uid://ctf3dsro4aqon"]
[gd_scene load_steps=2 format=3 uid="uid://ctf3dsro4aqon"]
[node name="XROrigin3D" type="XROrigin3D"]
[sub_resource type="CylinderMesh" id="CylinderMesh_y71p3"]
top_radius = 0.05
bottom_radius = 0.05
height = 0.05
[node name="VROrigin" type="VROrigin"]
[node name="XRCamera3D" type="XRCamera3D" parent="."]
current = true
[node name="LeftController" type="XRController3D" parent="."]
tracker = &"left_hand"
[node name="MeshInstance3D" type="MeshInstance3D" parent="LeftController"]
mesh = SubResource("CylinderMesh_y71p3")
[node name="RightController" type="XRController3D" parent="."]
tracker = &"right_hand"
[node name="MeshInstance3D" type="MeshInstance3D" parent="RightController"]
mesh = SubResource("CylinderMesh_y71p3")
[node name="ClientNode" type="ClientNode" parent="."]