From 4cb2b334abdc5b7933a5e7c71f6a551c0461ec71 Mon Sep 17 00:00:00 2001 From: Sara Date: Tue, 14 Oct 2025 22:46:20 +0200 Subject: [PATCH] feat: added VROrigin node --- modules/you_done_it/register_types.cpp | 2 ++ modules/you_done_it/ydi_vr_origin.cpp | 43 ++++++++++++++++++++++++++ modules/you_done_it/ydi_vr_origin.h | 17 ++++++++++ vr-project/project.godot | 1 + vr-project/scenes/game_scene.tscn | 6 ++-- vr-project/vr_base.tscn | 16 ++++++++-- 6 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 modules/you_done_it/ydi_vr_origin.cpp create mode 100644 modules/you_done_it/ydi_vr_origin.h diff --git a/modules/you_done_it/register_types.cpp b/modules/you_done_it/register_types.cpp index 74139d10..1215f5aa 100644 --- a/modules/you_done_it/register_types.cpp +++ b/modules/you_done_it/register_types.cpp @@ -3,6 +3,7 @@ #include "client_node.h" #include "server_node.h" #include "ydi_networking.h" +#include "ydi_vr_origin.h" #include 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(); ClassDB::register_class(); ClassDB::register_abstract_class(); + ClassDB::register_class(); } void uninitialize_you_done_it_module(ModuleInitializationLevel p_level) { diff --git a/modules/you_done_it/ydi_vr_origin.cpp b/modules/you_done_it/ydi_vr_origin.cpp new file mode 100644 index 00000000..89b4e049 --- /dev/null +++ b/modules/you_done_it/ydi_vr_origin.cpp @@ -0,0 +1,43 @@ +#include "ydi_vr_origin.h" +#include +#include +#include +#include + +void VROrigin::_bind_methods() {} + +void VROrigin::start_vr(Ref 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 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; + } +} diff --git a/modules/you_done_it/ydi_vr_origin.h b/modules/you_done_it/ydi_vr_origin.h new file mode 100644 index 00000000..8822177a --- /dev/null +++ b/modules/you_done_it/ydi_vr_origin.h @@ -0,0 +1,17 @@ +#pragma once + +#include +#include + +class VROrigin : public XROrigin3D { + GDCLASS(VROrigin, XROrigin3D); + static void _bind_methods(); + +private: + void start_vr(Ref with_interface); + void on_xr_interface_added(StringName interface); + void enter_tree(); + +protected: + void _notification(int what); +}; diff --git a/vr-project/project.godot b/vr-project/project.godot index 019bfa99..c658dcf8 100644 --- a/vr-project/project.godot +++ b/vr-project/project.godot @@ -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" diff --git a/vr-project/scenes/game_scene.tscn b/vr-project/scenes/game_scene.tscn index 834e2643..f085aa61 100644 --- a/vr-project/scenes/game_scene.tscn +++ b/vr-project/scenes/game_scene.tscn @@ -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) diff --git a/vr-project/vr_base.tscn b/vr-project/vr_base.tscn index 82a64dc7..f317419c 100644 --- a/vr-project/vr_base.tscn +++ b/vr-project/vr_base.tscn @@ -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="."]