diff --git a/addons/vrpn/docs/Notes.md b/addons/vrpn/docs/Notes.md index 9854ae2..8f3ae7f 100644 --- a/addons/vrpn/docs/Notes.md +++ b/addons/vrpn/docs/Notes.md @@ -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) - register listeners in session - listeners inject captured data with signals - - keep naming "classic" ??? ... above session is a tracker with a sender with sensors # Todo - [x] Testset for Quaternion rotations - [x] Axis as subscene +- [ ] make global/local a choice +- [ ] add velocity and acceleration +- [ ] add buttons # Internal Notes diff --git a/addons/vrpn/scripts/VRPN.gd b/addons/vrpn/scripts/VRPN.gd index eecd554..ec49769 100644 --- a/addons/vrpn/scripts/VRPN.gd +++ b/addons/vrpn/scripts/VRPN.gd @@ -2,7 +2,7 @@ extends Node class_name VRPN # tracking associated data -enum TrackingData { POS_QUAT, VELOCITY, ACCELERATION } +enum TrackingDataType { POS_QUAT, VELOCITY, ACCELERATION } # magic cookie const magic_cookie_start : String = "vrpn: ver." @@ -176,18 +176,53 @@ 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() # submit to listener for r in session.tracker_receivers: - r._on_pos_quat({ + r._on_tracker({ + "type" : TrackingDataType.POS_QUAT, "tracker" : session.sensors[sender_id], "sensor" : sensor_id, "position" : pos, "rotation" : quat }) '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 - #print("unhandled message type {0}".format([message_type])) - + static func aligned_size(actual_size : int, alignment : int = 8) -> int: return (actual_size + alignment - 1) & ~(alignment - 1) diff --git a/addons/vrpn/scripts/VRPN_Receiver.gd b/addons/vrpn/scripts/VRPN_Receiver.gd index a9654e3..c7894b4 100644 --- a/addons/vrpn/scripts/VRPN_Receiver.gd +++ b/addons/vrpn/scripts/VRPN_Receiver.gd @@ -7,12 +7,14 @@ class_name VRPN_Receiver @export var tracker_use_position : bool = true @export var tracker_use_rotation : bool = true - -func _on_pos_quat(tracker_data : Dictionary): - - 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) +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")