headTrackingFusionEntry function
void
headTrackingFusionEntry(
- dynamic mainSendPortArg
Head-tracking worker using the exact same fusion and signs as the main thread. Messages carry sensor acquisition timestamps and a reset revision so queued pre-recenter output cannot rotate a freshly recentered camera. Protocol:
0, sensitivity, predictionMs, offsetX, offsetY, pitchGain, damping, revision1, accelX, accelY, accelZ2, gyroX, gyroY, timestampUs, revision3, revisionresets temporal state, retaining measured gravity.4, revisioninvalidates a stale or unavailable gravity reference. Emitsrevision, dYaw, dPitch, absolutePitchOrNull.
Implementation
void headTrackingFusionEntry(dynamic mainSendPortArg) {
final mainSendPort = mainSendPortArg as SendPort;
final receivePort = ReceivePort();
final fusion = HeadTrackingFusion();
var revision = 0;
mainSendPort.send(receivePort.sendPort);
receivePort.listen((message) {
if (message is! List) return;
switch (message[0]) {
case 0:
fusion
..sensitivity = (message[1] as num).toDouble()
..predictionMs = (message[2] as num).toDouble()
..offsetX = (message[3] as num).toDouble()
..offsetY = (message[4] as num).toDouble()
..pitchGain = (message[5] as num).toDouble()
..jitterDamping = message[6] as bool;
revision = message[7] as int;
case 1:
fusion.updateGravity(
(message[1] as num).toDouble(),
(message[2] as num).toDouble(),
(message[3] as num).toDouble(),
);
case 2:
if (message[4] != revision) return;
if (fusion.addGyroscope(
(message[1] as num).toDouble(),
(message[2] as num).toDouble(),
message[3] as int,
)) {
mainSendPort.send([
revision,
fusion.dYaw,
fusion.dPitch,
fusion.absolutePitch,
]);
}
case 3:
revision = message[1] as int;
fusion.reset();
case 4:
revision = message[1] as int;
fusion.clearGravity();
}
});
}