Compare commits
2 commits
b54c78da19
...
3f823111d1
Author | SHA1 | Date | |
---|---|---|---|
|
3f823111d1 | ||
ea953e92a6 |
10 changed files with 119 additions and 44 deletions
11
addons/vrpn/docs/Examples.md
Normal file
11
addons/vrpn/docs/Examples.md
Normal file
|
@ -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
|
||||||
|
```
|
|
@ -1,7 +1,7 @@
|
||||||
[gd_scene load_steps=5 format=3 uid="uid://en7tpf1d6yak"]
|
[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://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"]
|
[ext_resource type="PackedScene" uid="uid://b426fy7d6jw2d" path="res://addons/vrpn/assets/axis.blend" id="3_73ywu"]
|
||||||
|
|
||||||
[sub_resource type="PlaneMesh" id="PlaneMesh_24d08"]
|
[sub_resource type="PlaneMesh" id="PlaneMesh_24d08"]
|
||||||
|
@ -19,20 +19,21 @@ shadow_enabled = true
|
||||||
|
|
||||||
[node name="Root" type="Node3D" parent="."]
|
[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")
|
script = ExtResource("1_jrm7s")
|
||||||
tracker_receivers = [NodePath("RB1"), NodePath("RB2")]
|
|
||||||
vrpn_server = "212.201.64.122"
|
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")
|
script = ExtResource("2_fp2uy")
|
||||||
|
vrpn = NodePath("..")
|
||||||
tracker_name = "RB1"
|
tracker_name = "RB1"
|
||||||
|
|
||||||
[node name="axis" parent="Root/VRPN/RB1" instance=ExtResource("3_73ywu")]
|
[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)
|
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")
|
script = ExtResource("2_fp2uy")
|
||||||
|
vrpn = NodePath("..")
|
||||||
tracker_name = "RB2"
|
tracker_name = "RB2"
|
||||||
|
|
||||||
[node name="axis" parent="Root/VRPN/RB2" instance=ExtResource("3_73ywu")]
|
[node name="axis" parent="Root/VRPN/RB2" instance=ExtResource("3_73ywu")]
|
||||||
|
|
|
@ -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://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="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"]
|
[sub_resource type="PlaneMesh" id="PlaneMesh_24d08"]
|
||||||
size = Vector2(6, 2)
|
size = Vector2(6, 2)
|
||||||
|
@ -18,9 +19,8 @@ shadow_enabled = true
|
||||||
|
|
||||||
[node name="Root" type="Node3D" parent="."]
|
[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")
|
script = ExtResource("2_24d08")
|
||||||
tracker_receivers = [NodePath("../SpinTracker/Offset0/Tracker0"), NodePath("../SpinTracker/Tracker1"), NodePath("../SpinTracker/Offset2/Tracker2")]
|
|
||||||
|
|
||||||
[node name="Floor" type="MeshInstance3D" parent="Root"]
|
[node name="Floor" type="MeshInstance3D" parent="Root"]
|
||||||
mesh = SubResource("PlaneMesh_24d08")
|
mesh = SubResource("PlaneMesh_24d08")
|
||||||
|
@ -28,8 +28,9 @@ mesh = SubResource("PlaneMesh_24d08")
|
||||||
[node name="SpinTracker" type="Node3D" parent="Root"]
|
[node name="SpinTracker" type="Node3D" parent="Root"]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.764802, 0)
|
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")
|
script = ExtResource("2_170dk")
|
||||||
|
vrpn = NodePath("../../VRPN")
|
||||||
tracker_name = "Tracker1"
|
tracker_name = "Tracker1"
|
||||||
tracker_use_position = false
|
tracker_use_position = false
|
||||||
|
|
||||||
|
@ -43,8 +44,9 @@ text = "Y-Axis"
|
||||||
[node name="Offset2" type="Node3D" parent="Root/SpinTracker"]
|
[node name="Offset2" type="Node3D" parent="Root/SpinTracker"]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 0)
|
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")
|
script = ExtResource("2_170dk")
|
||||||
|
vrpn = NodePath("../../../VRPN")
|
||||||
tracker_name = "Tracker2"
|
tracker_name = "Tracker2"
|
||||||
tracker_use_position = false
|
tracker_use_position = false
|
||||||
|
|
||||||
|
@ -58,8 +60,9 @@ text = "Z-Axis"
|
||||||
[node name="Offset0" type="Node3D" parent="Root/SpinTracker"]
|
[node name="Offset0" type="Node3D" parent="Root/SpinTracker"]
|
||||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0, 0)
|
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")
|
script = ExtResource("2_170dk")
|
||||||
|
vrpn = NodePath("../../../VRPN")
|
||||||
tracker_use_position = false
|
tracker_use_position = false
|
||||||
|
|
||||||
[node name="axis" parent="Root/SpinTracker/Offset0/Tracker0" instance=ExtResource("3_170dk")]
|
[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"]
|
[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)
|
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.769847, 0)
|
||||||
text = "X-Axis"
|
text = "X-Axis"
|
||||||
|
|
||||||
|
[node name="Button0" type="Node3D" parent="Root/SpinTracker" node_paths=PackedStringArray("vrpn")]
|
||||||
|
script = ExtResource("4_j4l28")
|
||||||
|
vrpn = NodePath("../../VRPN")
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
extends Node
|
|
||||||
class_name VRPN
|
class_name VRPN
|
||||||
|
extends Node
|
||||||
|
|
||||||
# tracking associated data
|
# tracking associated data
|
||||||
enum TrackingDataType { POS_QUAT, VELOCITY, ACCELERATION }
|
enum TrackingDataType { POS_QUAT, VELOCITY, ACCELERATION }
|
||||||
|
enum ButtonDataType { BUTTON_STATE, BUTTON_CHANGE }
|
||||||
|
|
||||||
# magic cookie
|
# magic cookie
|
||||||
const magic_cookie_start : String = "vrpn: ver."
|
const magic_cookie_start : String = "vrpn: ver."
|
||||||
|
@ -18,14 +19,14 @@ signal data(data:Array)
|
||||||
signal disconnected
|
signal disconnected
|
||||||
signal error(msg:String)
|
signal error(msg:String)
|
||||||
|
|
||||||
|
|
||||||
@onready var _stream: StreamPeerTCP = StreamPeerTCP.new()
|
|
||||||
|
|
||||||
@export var tracker_receivers : Array[VRPN_Receiver] = []
|
|
||||||
|
|
||||||
@export var vrpn_server : String = "127.0.0.1"
|
@export var vrpn_server : String = "127.0.0.1"
|
||||||
@export var vrpn_port : int = 3883
|
@export var vrpn_port : int = 3883
|
||||||
|
|
||||||
|
var tracker : Array[VRPN_Tracker] = []
|
||||||
|
var buttons : Array[VRPN_Button] = []
|
||||||
|
|
||||||
|
@onready var _stream: StreamPeerTCP = StreamPeerTCP.new()
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
|
|
||||||
self.connect_to_host(vrpn_server,vrpn_port)
|
self.connect_to_host(vrpn_server,vrpn_port)
|
||||||
|
@ -175,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
|
# 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()
|
var quat = Quaternion(body.get_double(),body.get_double(),body.get_double(),body.get_double()).normalized()
|
||||||
# submit to listener
|
# submit to listener
|
||||||
for r in session.tracker_receivers:
|
for r in session.tracker:
|
||||||
r._on_tracker({
|
r._on_vrpn({
|
||||||
"type" : TrackingDataType.POS_QUAT,
|
"type" : TrackingDataType.POS_QUAT,
|
||||||
"tracker" : session.sensors[sender_id],
|
"tracker" : session.sensors[sender_id],
|
||||||
"sensor" : sensor_id,
|
"sensor" : sensor_id,
|
||||||
|
@ -192,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
|
# 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()
|
var vel_rot = Quaternion(body.get_double(),body.get_double(),body.get_double(),body.get_double()).normalized()
|
||||||
# submit to listener
|
# submit to listener
|
||||||
for r in session.tracker_receivers:
|
for r in session.tracker:
|
||||||
r._on_tracker({
|
r._on_vrpn({
|
||||||
"type" : TrackingDataType.VELOCITY,
|
"type" : TrackingDataType.VELOCITY,
|
||||||
"tracker" : session.sensors[sender_id],
|
"tracker" : session.sensors[sender_id],
|
||||||
"sensor" : sensor_id,
|
"sensor" : sensor_id,
|
||||||
|
@ -211,8 +212,8 @@ static func marshall_body(data : PackedByteArray,message_type : int, sender_id:
|
||||||
|
|
||||||
var acc_dt = body.get_double() # padding
|
var acc_dt = body.get_double() # padding
|
||||||
# submit to listener
|
# submit to listener
|
||||||
for r in session.tracker_receivers:
|
for r in session.tracker:
|
||||||
r._on_tracker({
|
r._on_vrpn({
|
||||||
"type" : TrackingDataType.ACCELERATION,
|
"type" : TrackingDataType.ACCELERATION,
|
||||||
"tracker" : session.sensors[sender_id],
|
"tracker" : session.sensors[sender_id],
|
||||||
"sensor" : sensor_id,
|
"sensor" : sensor_id,
|
||||||
|
@ -220,6 +221,25 @@ static func marshall_body(data : PackedByteArray,message_type : int, sender_id:
|
||||||
"acceleration_rotation" : acc_rot,
|
"acceleration_rotation" : acc_rot,
|
||||||
"acceleration_dt" : acc_dt
|
"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
|
pass
|
||||||
|
|
||||||
|
|
18
addons/vrpn/scripts/VRPN_Button.gd
Normal file
18
addons/vrpn/scripts/VRPN_Button.gd
Normal file
|
@ -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
|
1
addons/vrpn/scripts/VRPN_Button.gd.uid
Normal file
1
addons/vrpn/scripts/VRPN_Button.gd.uid
Normal file
|
@ -0,0 +1 @@
|
||||||
|
uid://bmlyip5xa5df4
|
|
@ -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")
|
|
33
addons/vrpn/scripts/VRPN_Tracker.gd
Normal file
33
addons/vrpn/scripts/VRPN_Tracker.gd
Normal file
|
@ -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.
|
|
@ -14,3 +14,7 @@ config/name="uvrpn"
|
||||||
run/main_scene="uid://bj5ykdjle10tt"
|
run/main_scene="uid://bj5ykdjle10tt"
|
||||||
config/features=PackedStringArray("4.4", "Forward Plus")
|
config/features=PackedStringArray("4.4", "Forward Plus")
|
||||||
config/icon="uid://cdprcmtx102rp"
|
config/icon="uid://cdprcmtx102rp"
|
||||||
|
|
||||||
|
[rendering]
|
||||||
|
|
||||||
|
anti_aliasing/quality/screen_space_aa=1
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue