From 3f823111d14f410a05b8ee9559548125b3473d43 Mon Sep 17 00:00:00 2001 From: Hartmut Seichter Date: Mon, 7 Jul 2025 22:43:04 +0200 Subject: [PATCH] make proper setup for VRPN with buttons and trackers --- addons/vrpn/docs/Examples.md | 11 ++++++ addons/vrpn/examples/optitrack.tscn | 11 +++--- addons/vrpn/examples/spin_tracker.tscn | 21 +++++++---- addons/vrpn/scripts/VRPN.gd | 35 +++++++++++++++---- addons/vrpn/scripts/VRPN_Button.gd | 18 ++++++++++ addons/vrpn/scripts/VRPN_Button.gd.uid | 1 + addons/vrpn/scripts/VRPN_Receiver.gd | 20 ----------- addons/vrpn/scripts/VRPN_Tracker.gd | 33 +++++++++++++++++ ...PN_Receiver.gd.uid => VRPN_Tracker.gd.uid} | 0 project.godot | 4 +++ 10 files changed, 115 insertions(+), 39 deletions(-) create mode 100644 addons/vrpn/docs/Examples.md create mode 100644 addons/vrpn/scripts/VRPN_Button.gd create mode 100644 addons/vrpn/scripts/VRPN_Button.gd.uid delete mode 100644 addons/vrpn/scripts/VRPN_Receiver.gd create mode 100644 addons/vrpn/scripts/VRPN_Tracker.gd rename addons/vrpn/scripts/{VRPN_Receiver.gd.uid => VRPN_Tracker.gd.uid} (100%) diff --git a/addons/vrpn/docs/Examples.md b/addons/vrpn/docs/Examples.md new file mode 100644 index 0000000..e158fa2 --- /dev/null +++ b/addons/vrpn/docs/Examples.md @@ -0,0 +1,11 @@ +--- +--- + +```sh +[you@yourpc uvrpn]$ vrpn_server -f addons/vrpn/tests/vrpn.test.cfg +Reading from config file addons/vrpn/tests/vrpn.test.cfg +Opening vrpn_Tracker_Spin: Tracker0 with 1 sensors, rate 200.000000 +Opening vrpn_Tracker_Spin: Tracker1 with 1 sensors, rate 200.000000 +Opening vrpn_Tracker_Spin: Tracker2 with 1 sensors, rate 200.000000 +Opening vrpn_Button_Example: Button0 with 2 sensors, toggle rate 2.000000 +``` diff --git a/addons/vrpn/examples/optitrack.tscn b/addons/vrpn/examples/optitrack.tscn index 819a329..f1ee4d5 100644 --- a/addons/vrpn/examples/optitrack.tscn +++ b/addons/vrpn/examples/optitrack.tscn @@ -1,7 +1,7 @@ [gd_scene load_steps=5 format=3 uid="uid://en7tpf1d6yak"] [ext_resource type="Script" uid="uid://dmq3i7qmo1qe0" path="res://addons/vrpn/scripts/VRPN.gd" id="1_jrm7s"] -[ext_resource type="Script" uid="uid://dpj1wrvfsiq4v" path="res://addons/vrpn/scripts/VRPN_Receiver.gd" id="2_fp2uy"] +[ext_resource type="Script" uid="uid://dpj1wrvfsiq4v" path="res://addons/vrpn/scripts/VRPN_Tracker.gd" id="2_fp2uy"] [ext_resource type="PackedScene" uid="uid://b426fy7d6jw2d" path="res://addons/vrpn/assets/axis.blend" id="3_73ywu"] [sub_resource type="PlaneMesh" id="PlaneMesh_24d08"] @@ -19,20 +19,21 @@ shadow_enabled = true [node name="Root" type="Node3D" parent="."] -[node name="VRPN" type="Node3D" parent="Root" node_paths=PackedStringArray("tracker_receivers")] +[node name="VRPN" type="Node3D" parent="Root"] script = ExtResource("1_jrm7s") -tracker_receivers = [NodePath("RB1"), NodePath("RB2")] vrpn_server = "212.201.64.122" -[node name="RB1" type="Node3D" parent="Root/VRPN"] +[node name="RB1" type="Node3D" parent="Root/VRPN" node_paths=PackedStringArray("vrpn")] script = ExtResource("2_fp2uy") +vrpn = NodePath("..") tracker_name = "RB1" [node name="axis" parent="Root/VRPN/RB1" instance=ExtResource("3_73ywu")] transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, 0, 0) -[node name="RB2" type="Node3D" parent="Root/VRPN"] +[node name="RB2" type="Node3D" parent="Root/VRPN" node_paths=PackedStringArray("vrpn")] script = ExtResource("2_fp2uy") +vrpn = NodePath("..") tracker_name = "RB2" [node name="axis" parent="Root/VRPN/RB2" instance=ExtResource("3_73ywu")] diff --git a/addons/vrpn/examples/spin_tracker.tscn b/addons/vrpn/examples/spin_tracker.tscn index cb3e429..a02eceb 100644 --- a/addons/vrpn/examples/spin_tracker.tscn +++ b/addons/vrpn/examples/spin_tracker.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=5 format=3 uid="uid://bj5ykdjle10tt"] +[gd_scene load_steps=6 format=3 uid="uid://bj5ykdjle10tt"] [ext_resource type="Script" uid="uid://dmq3i7qmo1qe0" path="res://addons/vrpn/scripts/VRPN.gd" id="2_24d08"] -[ext_resource type="Script" uid="uid://dpj1wrvfsiq4v" path="res://addons/vrpn/scripts/VRPN_Receiver.gd" id="2_170dk"] +[ext_resource type="Script" uid="uid://dpj1wrvfsiq4v" path="res://addons/vrpn/scripts/VRPN_Tracker.gd" id="2_170dk"] [ext_resource type="PackedScene" uid="uid://b426fy7d6jw2d" path="res://addons/vrpn/assets/axis.blend" id="3_170dk"] +[ext_resource type="Script" uid="uid://bmlyip5xa5df4" path="res://addons/vrpn/scripts/VRPN_Button.gd" id="4_j4l28"] [sub_resource type="PlaneMesh" id="PlaneMesh_24d08"] size = Vector2(6, 2) @@ -18,9 +19,8 @@ shadow_enabled = true [node name="Root" type="Node3D" parent="."] -[node name="VRPN" type="Node3D" parent="Root" node_paths=PackedStringArray("tracker_receivers")] +[node name="VRPN" type="Node3D" parent="Root"] script = ExtResource("2_24d08") -tracker_receivers = [NodePath("../SpinTracker/Offset0/Tracker0"), NodePath("../SpinTracker/Tracker1"), NodePath("../SpinTracker/Offset2/Tracker2")] [node name="Floor" type="MeshInstance3D" parent="Root"] mesh = SubResource("PlaneMesh_24d08") @@ -28,8 +28,9 @@ mesh = SubResource("PlaneMesh_24d08") [node name="SpinTracker" type="Node3D" parent="Root"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.764802, 0) -[node name="Tracker1" type="Node3D" parent="Root/SpinTracker"] +[node name="Tracker1" type="Node3D" parent="Root/SpinTracker" node_paths=PackedStringArray("vrpn")] script = ExtResource("2_170dk") +vrpn = NodePath("../../VRPN") tracker_name = "Tracker1" tracker_use_position = false @@ -43,8 +44,9 @@ text = "Y-Axis" [node name="Offset2" type="Node3D" parent="Root/SpinTracker"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0) -[node name="Tracker2" type="Node3D" parent="Root/SpinTracker/Offset2"] +[node name="Tracker2" type="Node3D" parent="Root/SpinTracker/Offset2" node_paths=PackedStringArray("vrpn")] script = ExtResource("2_170dk") +vrpn = NodePath("../../../VRPN") tracker_name = "Tracker2" tracker_use_position = false @@ -58,8 +60,9 @@ text = "Z-Axis" [node name="Offset0" type="Node3D" parent="Root/SpinTracker"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0, 0) -[node name="Tracker0" type="Node3D" parent="Root/SpinTracker/Offset0"] +[node name="Tracker0" type="Node3D" parent="Root/SpinTracker/Offset0" node_paths=PackedStringArray("vrpn")] script = ExtResource("2_170dk") +vrpn = NodePath("../../../VRPN") tracker_use_position = false [node name="axis" parent="Root/SpinTracker/Offset0/Tracker0" instance=ExtResource("3_170dk")] @@ -68,3 +71,7 @@ transform = Transform3D(0.1, 0, 0, 0, 0.1, 0, 0, 0, 0.1, 0, 0, 0) [node name="Label3D" type="Label3D" parent="Root/SpinTracker/Offset0/Tracker0"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.769847, 0) text = "X-Axis" + +[node name="Button0" type="Node3D" parent="Root/SpinTracker" node_paths=PackedStringArray("vrpn")] +script = ExtResource("4_j4l28") +vrpn = NodePath("../../VRPN") diff --git a/addons/vrpn/scripts/VRPN.gd b/addons/vrpn/scripts/VRPN.gd index 0868552..0282655 100644 --- a/addons/vrpn/scripts/VRPN.gd +++ b/addons/vrpn/scripts/VRPN.gd @@ -3,6 +3,7 @@ extends Node # tracking associated data enum TrackingDataType { POS_QUAT, VELOCITY, ACCELERATION } +enum ButtonDataType { BUTTON_STATE, BUTTON_CHANGE } # magic cookie const magic_cookie_start : String = "vrpn: ver." @@ -21,7 +22,8 @@ signal error(msg:String) @export var vrpn_server : String = "127.0.0.1" @export var vrpn_port : int = 3883 -@export var tracker_receivers : Array[VRPN_Receiver] = [] +var tracker : Array[VRPN_Tracker] = [] +var buttons : Array[VRPN_Button] = [] @onready var _stream: StreamPeerTCP = StreamPeerTCP.new() @@ -174,8 +176,8 @@ static func marshall_body(data : PackedByteArray,message_type : int, sender_id: # VRPN quat layout and Godot Quaternion c'tor identical with x,y,z,w var quat = Quaternion(body.get_double(),body.get_double(),body.get_double(),body.get_double()).normalized() # submit to listener - for r in session.tracker_receivers: - r._on_tracker({ + for r in session.tracker: + r._on_vrpn({ "type" : TrackingDataType.POS_QUAT, "tracker" : session.sensors[sender_id], "sensor" : sensor_id, @@ -191,8 +193,8 @@ static func marshall_body(data : PackedByteArray,message_type : int, sender_id: # VRPN quat layout and Godot Quaternion c'tor identical with x,y,z,w var vel_rot = Quaternion(body.get_double(),body.get_double(),body.get_double(),body.get_double()).normalized() # submit to listener - for r in session.tracker_receivers: - r._on_tracker({ + for r in session.tracker: + r._on_vrpn({ "type" : TrackingDataType.VELOCITY, "tracker" : session.sensors[sender_id], "sensor" : sensor_id, @@ -210,8 +212,8 @@ static func marshall_body(data : PackedByteArray,message_type : int, sender_id: var acc_dt = body.get_double() # padding # submit to listener - for r in session.tracker_receivers: - r._on_tracker({ + for r in session.tracker: + r._on_vrpn({ "type" : TrackingDataType.ACCELERATION, "tracker" : session.sensors[sender_id], "sensor" : sensor_id, @@ -219,6 +221,25 @@ static func marshall_body(data : PackedByteArray,message_type : int, sender_id: "acceleration_rotation" : acc_rot, "acceleration_dt" : acc_dt }) + 'vrpn_Button Change': + var num_buttons : int = body.get_32() + var button_changes : Dictionary = {} + for i in range(num_buttons): + button_changes[i] = body.get_32() + for button in session.buttons: + button._on_vrpn( + { + "type" : ButtonDataType.BUTTON_CHANGE, + "sensor" : session.sensors[sender_id], + "changes" : button_changes + } + ) + 'vrpn_Button States': + var num_buttons : int = body.get_32() + for i in range(num_buttons): + var button_state = body.get_32() + #print("button state {0} : {1}".format([i,button_state])) + _: pass diff --git a/addons/vrpn/scripts/VRPN_Button.gd b/addons/vrpn/scripts/VRPN_Button.gd new file mode 100644 index 0000000..2bb825d --- /dev/null +++ b/addons/vrpn/scripts/VRPN_Button.gd @@ -0,0 +1,18 @@ +class_name VRPN_Button +extends Node + +@export var vrpn : VRPN = null +@export var button_sensor : String = "Button0" +@export var register_on_start : bool = true + +var state : int = 0 + +func _ready(): + if not vrpn: + push_warning("No VRPN client for button on '%s' given." % [self.name]) + elif register_on_start: + vrpn.buttons.append(self) + +func _on_vrpn(vrpn_data : Dictionary) -> void: + if vrpn_data['sensor'] == button_sensor: + pass diff --git a/addons/vrpn/scripts/VRPN_Button.gd.uid b/addons/vrpn/scripts/VRPN_Button.gd.uid new file mode 100644 index 0000000..862cc52 --- /dev/null +++ b/addons/vrpn/scripts/VRPN_Button.gd.uid @@ -0,0 +1 @@ +uid://bmlyip5xa5df4 diff --git a/addons/vrpn/scripts/VRPN_Receiver.gd b/addons/vrpn/scripts/VRPN_Receiver.gd deleted file mode 100644 index c7894b4..0000000 --- a/addons/vrpn/scripts/VRPN_Receiver.gd +++ /dev/null @@ -1,20 +0,0 @@ -extends Node3D - -class_name VRPN_Receiver - -@export var tracker_name : String = "Tracker0" -@export var tracker_sensor : int = 0 -@export var tracker_use_position : bool = true -@export var tracker_use_rotation : bool = true - -func _on_tracker(tracker_data : Dictionary): - match tracker_data['type'] as VRPN.TrackingDataType: - VRPN.TrackingDataType.POS_QUAT: - if tracker_data['tracker'] == tracker_name and tracker_data['sensor'] == tracker_sensor: - if tracker_use_position: - self.global_position = tracker_data['position'] - if tracker_use_rotation: - var rotation := tracker_data['rotation'] as Quaternion - self.global_basis = Basis(rotation) - _: - push_warning("unknown tracker datatype") diff --git a/addons/vrpn/scripts/VRPN_Tracker.gd b/addons/vrpn/scripts/VRPN_Tracker.gd new file mode 100644 index 0000000..ea44069 --- /dev/null +++ b/addons/vrpn/scripts/VRPN_Tracker.gd @@ -0,0 +1,33 @@ +class_name VRPN_Tracker +extends Node3D + +@export var vrpn : VRPN = null +@export var tracker_name : String = "Tracker0" +@export var tracker_sensor : int = 0 +@export var tracker_use_position : bool = true +@export var tracker_use_rotation : bool = true +@export var register_on_start : bool = true + +func _ready() -> void: + if vrpn and register_on_start: + vrpn.tracker.append(self) + +func _on_vrpn(vrpn_data : Dictionary): + match vrpn_data['type'] as VRPN.TrackingDataType: + VRPN.TrackingDataType.POS_QUAT: + if vrpn_data['tracker'] == tracker_name and vrpn_data['sensor'] == tracker_sensor: + if tracker_use_position: + self.global_position = vrpn_data['position'] + if tracker_use_rotation: + var rotation := vrpn_data['rotation'] as Quaternion + self.global_basis = Basis(rotation) + VRPN.TrackingDataType.ACCELERATION: + pass + VRPN.TrackingDataType.VELOCITY: + pass + _: + push_warning("unknown tracker datatype") + + +func _on_vrpn_connected(s): + pass # Replace with function body. diff --git a/addons/vrpn/scripts/VRPN_Receiver.gd.uid b/addons/vrpn/scripts/VRPN_Tracker.gd.uid similarity index 100% rename from addons/vrpn/scripts/VRPN_Receiver.gd.uid rename to addons/vrpn/scripts/VRPN_Tracker.gd.uid diff --git a/project.godot b/project.godot index 19b923a..c77dfbc 100644 --- a/project.godot +++ b/project.godot @@ -14,3 +14,7 @@ config/name="uvrpn" run/main_scene="uid://bj5ykdjle10tt" config/features=PackedStringArray("4.4", "Forward Plus") config/icon="uid://cdprcmtx102rp" + +[rendering] + +anti_aliasing/quality/screen_space_aa=1