make proper setup for VRPN with buttons and trackers
This commit is contained in:
parent
ea953e92a6
commit
3f823111d1
10 changed files with 115 additions and 39 deletions
|
@ -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
|
||||
|
||||
|
|
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.
|
Loading…
Add table
Add a link
Reference in a new issue