better proxying of data into the receivers

This commit is contained in:
Hartmut Seichter 2025-07-03 10:27:08 +02:00
parent 4da8618746
commit b54c78da19
3 changed files with 54 additions and 15 deletions

View file

@ -12,12 +12,14 @@ and immediatly made available. Minimal or no internal state keeping!
- first collect names and ids of message_types and senders (stored in session) - first collect names and ids of message_types and senders (stored in session)
- register listeners in session - register listeners in session
- listeners inject captured data with signals - listeners inject captured data with signals
- keep naming "classic" ??? ... above session is a tracker with a sender with sensors - keep naming "classic" ??? ... above session is a tracker with a sender with sensors
# Todo # Todo
- [x] Testset for Quaternion rotations - [x] Testset for Quaternion rotations
- [x] Axis as subscene - [x] Axis as subscene
- [ ] make global/local a choice
- [ ] add velocity and acceleration
- [ ] add buttons
# Internal Notes # Internal Notes

View file

@ -2,7 +2,7 @@ extends Node
class_name VRPN class_name VRPN
# tracking associated data # tracking associated data
enum TrackingData { POS_QUAT, VELOCITY, ACCELERATION } enum TrackingDataType { POS_QUAT, VELOCITY, ACCELERATION }
# magic cookie # magic cookie
const magic_cookie_start : String = "vrpn: ver." const magic_cookie_start : String = "vrpn: ver."
@ -176,17 +176,52 @@ static func marshall_body(data : PackedByteArray,message_type : int, sender_id:
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_receivers:
r._on_pos_quat({ r._on_tracker({
"type" : TrackingDataType.POS_QUAT,
"tracker" : session.sensors[sender_id], "tracker" : session.sensors[sender_id],
"sensor" : sensor_id, "sensor" : sensor_id,
"position" : pos, "position" : pos,
"rotation" : quat "rotation" : quat
}) })
'vrpn_Tracker Velocity': 'vrpn_Tracker Velocity':
pass # get id
var sensor_id = body.get_32()
var padding = body.get_32() # padding
# position
var vel = Vector3(body.get_double(),body.get_double(),body.get_double())
# 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({
"type" : TrackingDataType.VELOCITY,
"tracker" : session.sensors[sender_id],
"sensor" : sensor_id,
"velocity_linear" : vel,
"velocity_rotation" : vel_rot
})
'vrpn_Tracker Acceleration':
# get id
var sensor_id = body.get_32()
var padding = body.get_32() # padding
# position
var acc = Vector3(body.get_double(),body.get_double(),body.get_double())
# VRPN quat layout and Godot Quaternion c'tor identical with x,y,z,w
var acc_rot = Quaternion(body.get_double(),body.get_double(),body.get_double(),body.get_double()).normalized()
var acc_dt = body.get_double() # padding
# submit to listener
for r in session.tracker_receivers:
r._on_tracker({
"type" : TrackingDataType.ACCELERATION,
"tracker" : session.sensors[sender_id],
"sensor" : sensor_id,
"acceleration_linear" : acc,
"acceleration_rotation" : acc_rot,
"acceleration_dt" : acc_dt
})
_: _:
pass pass
#print("unhandled message type {0}".format([message_type]))
static func aligned_size(actual_size : int, alignment : int = 8) -> int: static func aligned_size(actual_size : int, alignment : int = 8) -> int:

View file

@ -7,12 +7,14 @@ class_name VRPN_Receiver
@export var tracker_use_position : bool = true @export var tracker_use_position : bool = true
@export var tracker_use_rotation : bool = true @export var tracker_use_rotation : bool = true
func _on_tracker(tracker_data : Dictionary):
func _on_pos_quat(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_data['tracker'] == tracker_name and tracker_data['sensor'] == tracker_sensor:
if tracker_use_position: if tracker_use_position:
self.global_position = tracker_data['position'] self.global_position = tracker_data['position']
if tracker_use_rotation: if tracker_use_rotation:
var rotation := tracker_data['rotation'] as Quaternion var rotation := tracker_data['rotation'] as Quaternion
self.global_basis = Basis(rotation) self.global_basis = Basis(rotation)
_:
push_warning("unknown tracker datatype")